注意:如果您想调用受保护或私有方法,您首先需要使用 setAccessible() 方法使它们可访问(参见 https://php.net/reflectionmethod.setaccessible)。
(PHP 5, PHP 7, PHP 8)
ReflectionMethod::invoke — 调用
返回方法结果。
示例 #1 ReflectionMethod::invoke() 示例
<?php
class HelloWorld {
public function sayHelloTo($name) {
return 'Hello ' . $name;
}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
?>
上面的例子将输出
Hello Mike
注意:
当需要引用参数时,ReflectionMethod::invoke() 无法使用。应该使用 ReflectionMethod::invokeArgs()(在参数列表中传递引用)。
注意:如果您想调用受保护或私有方法,您首先需要使用 setAccessible() 方法使它们可访问(参见 https://php.net/reflectionmethod.setaccessible)。
此方法可用于在子类实例上调用父类的覆盖的公共方法
以下代码将输出“A”
<?php
class A
{
public function foo()
{
return __CLASS__;
}
}
class B extends A
{
public function foo()
{
return __CLASS__;
}
}
$b = new B();
$reflection = new ReflectionObject($b);
$parentReflection = $reflection->getParentClass();
$parentFooReflection = $parentReflection->getMethod('foo');
$data = $parentFooReflection->invoke($b);
echo $data;
?>
看起来反射不能解析延迟静态绑定 - var_dump 将显示“string 'a' (length=1)”
<?php
class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
class ChildClass extends ParentClass { protected static $a = 'b'; }
$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>