xref: /PHP-7.4/tests/classes/__call_007.phpt (revision d7a3edd4)
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