<?php

class Test {
    public static function __callStatic($method, $args) {}
    public function __call($method, $args) {}
}

function do_throw() { throw new Exception; }

try {
    Test::foo(do_throw());
} catch (Exception $e) {
    echo "Caught!\n";
}
try {
    (new Test)->bar(do_throw());
} catch (Exception $e) {
    echo "Caught!\n";
}

try {
    $f = function () {};
    $f->__invoke(do_throw());
} catch (Exception $e) {
    echo "Caught!\n";
}

try {
    $t = new Test;
    $f->__invoke($t->bar(Test::foo(do_throw())));
} catch (Exception $e) {
    echo "Caught!\n";
}

?>