xref: /PHP-7.4/tests/classes/__call_006.phpt (revision d7a3edd4)
1--TEST--
2Ensure exceptions are handled properly when thrown in __call.
3--FILE--
4<?php
5class A {
6	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--
55---> Invoke __call via simple method call.
56object(A)#%d (0) {
57}
58Exception caught OK; continuing.
59
60
61---> Invoke __call via scope resolution operator within instance.
62object(A)#%d (0) {
63}
64Exception caught OK; continuing.
65
66
67---> Invoke __call via scope resolution operator within child instance.
68object(B)#%d (0) {
69}
70Exception caught OK; continuing.
71
72
73---> Invoke __call via callback.
74object(B)#%d (0) {
75}
76Exception caught OK; continuing.
77==DONE==
78