ReflectionMethod::invoke

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::invoke调用

描述

public ReflectionMethod::invoke(?object $object, mixed ...$args): mixed

调用一个反射方法。

参数

object

要调用该方法的对象。对于静态方法,请将 null 传递给此参数。

args

要传递给该方法的零个或多个参数。它接受可变数量的参数,这些参数将传递给该方法。

返回值

返回方法结果。

错误/异常

如果 object 参数不包含该方法声明所在的类的实例,则会抛出 ReflectionException

如果方法调用失败,则会抛出 ReflectionException

示例

示例 #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()(在参数列表中传递引用)。

参见

添加注释

用户贡献的注释 3 个注释

rojaro at gmail dot com
13 年前
注意:如果您想调用受保护或私有方法,您首先需要使用 setAccessible() 方法使它们可访问(参见 https://php.net/reflectionmethod.setaccessible)。
dimitriy at remerov dot ru
12 年前
此方法可用于在子类实例上调用父类的覆盖的公共方法
以下代码将输出“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;

?>
templargrey at wp dot pl
13 年前
看起来反射不能解析延迟静态绑定 - 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));
?>
To Top