PHP Conference Japan 2024

ReflectionMethod::invokeArgs

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionMethod::invokeArgs调用参数

描述

public ReflectionMethod::invokeArgs(?object $object, array $args): mixed

调用反射方法并将参数作为数组传递。

参数

object

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

args

要传递给函数的参数,作为array

返回值

返回方法的结果。

错误/异常

如果object参数不包含声明此方法的类的实例,则会引发ReflectionException

如果方法调用失败,则会引发ReflectionException

变更日志

版本 描述
8.0.0 args键现在将被解释为参数名,而不是被静默忽略。

示例

示例 #1 ReflectionMethod::invokeArgs() 示例

<?php
class HelloWorld {

public function
sayHelloTo($name) {
return
'Hello ' . $name;
}

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo
$reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>

以上示例将输出

Hello Mike

备注

注意:

如果函数的参数需要是引用,则它们必须在传递的参数列表中是引用。

参见

添加备注

用户贡献的备注 4 个备注

serg dot smertin at gmail dot com
14 年前
我们可以进行一些高级操作,这在模板块调用中很有用

<?php
$object
->__named('methodNameHere', array('arg3' => 'three', 'arg1' => 'one'));

...

/**
* 按名称传递方法参数
*
* @param string $method
* @param array $args
* @return mixed
*/
public function __named($method, array $args = array())
{
$reflection = new ReflectionMethod($this, $method);

$pass = array();
foreach(
$reflection->getParameters() as $param)
{
/* @var $param ReflectionParameter */
if(isset($args[$param->getName()]))
{
$pass[] = $args[$param->getName()];
}
else
{
$pass[] = $param->getDefaultValue();
}
}

return
$reflection->invokeArgs($this, $pass);
}
?>
agent_harris at secure-mail dot biz
13 年前
对于引用传递问题,有一个简单的解决方法
由于反射API必须以通用的方式处理所有参数,因此它无法猜测您是否希望按值或按引用传递数据。

但似乎您也可以决定从调用函数或方法的地方传递引用(不仅仅是声明中的&前缀)。

所以只需执行以下操作;这对我有效

<?php
//...
$method->invoke($object, $inputValue, &$outputValue);
?>

由于这仅在数组和原始数据类型中才需要,因此在大多数情况下,预先知道是否需要按引用传递是可以接受的。但可能还需要始终在声明中保留&符号(因为在实际函数和invoke调用之间至少有两层)。

如果这是预期的行为,那么在invoke和invokeArgs的文档中提及它可能是有意义的。
CodeCoutureXX at gmail dot com
9 年前
如果需要对静态函数调用ReflectionMethod::invokeArgs(),则可以为$object参数传递NULL。

示例

<?php
class myClass {
public static
myStaticFunc($a, $b) {
return
$a + $b;
}
}

$ref = new ReflectionMethod('myClass', 'myStaticFunc');
echo
$ref->invokeArgs(NULL, [12, 7]);
?>

产生以下输出

19
cweiske at cweiske dot de
13 年前
按引用传递参数有效
<?php $rm->invokeArgs($object, array(&$foo, $bar)); ?>
To Top