1--TEST--
2ReflectionMethod::invoke()
3--FILE--
4<?php
5
6class TestClass {
7    public $prop = 2;
8
9    public function foo() {
10        echo "Called foo(), property = $this->prop\n";
11        var_dump($this);
12        return "Return Val";
13    }
14
15    public function willThrow() {
16        throw new Exception("Called willThrow()");
17    }
18
19    public function methodWithArgs($a, $b) {
20        echo "Called methodWithArgs($a, $b)\n";
21    }
22
23    public static function staticMethod() {
24        echo "Called staticMethod()\n";
25        try {
26            var_dump($this);
27        } catch (Throwable $e) {
28            echo "Exception: " . $e->getMessage() . "\n";
29        }
30    }
31
32    private static function privateMethod() {
33        echo "Called privateMethod()\n";
34    }
35}
36
37abstract class AbstractClass {
38    abstract function foo();
39}
40
41$foo = new ReflectionMethod('TestClass', 'foo');
42$methodWithArgs = new ReflectionMethod('TestClass', 'methodWithArgs');
43$staticMethod = new ReflectionMethod('TestClass', 'staticMethod');
44$privateMethod = new ReflectionMethod('TestClass', 'privateMethod');
45$methodThatThrows = new ReflectionMethod('TestClass', 'willThrow');
46
47$testClassInstance = new TestClass();
48$testClassInstance->prop = "Hello";
49
50echo "Public method:\n";
51
52var_dump($foo->invoke($testClassInstance));
53
54var_dump($foo->invoke($testClassInstance, true));
55
56echo "\nMethod with args:\n";
57
58var_dump($methodWithArgs->invoke($testClassInstance, 1, "arg2"));
59var_dump($methodWithArgs->invoke($testClassInstance, 1, "arg2", 3));
60
61echo "\nStatic method:\n";
62
63try {
64    var_dump($staticMethod->invoke());
65} catch (TypeError $e) {
66    echo $e->getMessage(), "\n";
67}
68try {
69    var_dump($staticMethod->invoke(true));
70} catch (TypeError $e) {
71    echo $e->getMessage(), "\n";
72}
73var_dump($staticMethod->invoke(new stdClass()));
74
75echo "\nMethod that throws an exception:\n";
76try {
77    var_dump($methodThatThrows->invoke($testClassInstance));
78} catch (Exception $exc) {
79    var_dump($exc->getMessage());
80}
81
82?>
83--EXPECTF--
84Public method:
85Called foo(), property = Hello
86object(TestClass)#%d (1) {
87  ["prop"]=>
88  string(5) "Hello"
89}
90string(10) "Return Val"
91Called foo(), property = Hello
92object(TestClass)#%d (1) {
93  ["prop"]=>
94  string(5) "Hello"
95}
96string(10) "Return Val"
97
98Method with args:
99Called methodWithArgs(1, arg2)
100NULL
101Called methodWithArgs(1, arg2)
102NULL
103
104Static method:
105ReflectionMethod::invoke() expects at least 1 argument, 0 given
106ReflectionMethod::invoke(): Argument #1 ($object) must be of type ?object, true given
107Called staticMethod()
108Exception: Using $this when not in object context
109NULL
110
111Method that throws an exception:
112string(18) "Called willThrow()"
113