1--TEST-- 2Ensure exceptions are handled properly when thrown in a statically declared __call. 3--FILE-- 4<?php 5class A { 6 static function __call($strMethod, $arrArgs) { 7 @var_dump($this); 8 throw new Exception; 9 echo "You should not see this"; 10 } 11 function test() { 12 A::unknownCalledWithSRO(1,2,3); 13 } 14} 15 16class B extends A { 17 function test() { 18 B::unknownCalledWithSROFromChild(1,2,3); 19 } 20} 21 22$a = new A(); 23 24echo "---> Invoke __call via simple method call.\n"; 25try { 26 $a->unknown(); 27} catch (Exception $e) { 28 echo "Exception caught OK; continuing.\n"; 29} 30 31echo "\n\n---> Invoke __call via scope resolution operator within instance.\n"; 32try { 33 $a->test(); 34} catch (Exception $e) { 35 echo "Exception caught OK; continuing.\n"; 36} 37 38echo "\n\n---> Invoke __call via scope resolution operator within child instance.\n"; 39$b = new B(); 40try { 41 $b->test(); 42} catch (Exception $e) { 43 echo "Exception caught OK; continuing.\n"; 44} 45 46echo "\n\n---> Invoke __call via callback.\n"; 47try { 48 call_user_func(array($b, 'unknownCallback'), 1,2,3); 49} catch (Exception $e) { 50 echo "Exception caught OK; continuing.\n"; 51} 52?> 53==DONE== 54--EXPECTF-- 55Warning: The magic method __call() must have public visibility and cannot be static in %s on line 3 56---> Invoke __call via simple method call. 57object(A)#1 (0) { 58} 59Exception caught OK; continuing. 60 61 62---> Invoke __call via scope resolution operator within instance. 63object(A)#1 (0) { 64} 65Exception caught OK; continuing. 66 67 68---> Invoke __call via scope resolution operator within child instance. 69object(B)#2 (0) { 70} 71Exception caught OK; continuing. 72 73 74---> Invoke __call via callback. 75object(B)#2 (0) { 76} 77Exception caught OK; continuing. 78==DONE== 79