在 call_user_func_array() 的情况下,如果您要传递一个匿名函数并在匿名函数中引用 $this,$this 将忠实地引用定义函数的类中的上下文。使用 ReflectionFunction::invokeArgs() 似乎没有保留其原始上下文——是的,即使您在调用之前绑定匿名函数。我建议在上下文是一个问题时使用 call_user_func_array()。
(PHP 5 >= 5.1.2,PHP 7,PHP 8)
ReflectionFunction::invokeArgs — 调用函数参数
返回调用函数的结果
版本 | 说明 |
---|---|
8.0.0 |
args 的键现在将被解释为参数名称,而不是被静默忽略。 |
示例 #1 ReflectionFunction::invokeArgs() 示例
<?php
function title($title, $name)
{
return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
echo $function->invokeArgs(array('Dr', 'Phil'));
?>
上面的例子将输出
Dr. Phil
示例 #2 带引用的 ReflectionFunction::invokeArgs() 示例
<?php
function get_false_conditions(array $conditions, array &$false_conditions)
{
foreach ($conditions as $condition) {
if (!$condition) {
$false_conditions[] = $condition;
}
}
}
$function_ref = new ReflectionFunction('get_false_conditions');
$conditions = array(true, false, -1, 0, 1);
$false_conditions = array();
$function_ref->invokeArgs(array($conditions, &$false_conditions));
var_dump($false_conditions);
?>
上面的例子将输出
array(2) { [0]=> bool(false) [1]=> int(0) }
注意:
如果函数具有需要引用的参数,那么它们必须在传递的参数列表中引用。
在 call_user_func_array() 的情况下,如果您要传递一个匿名函数并在匿名函数中引用 $this,$this 将忠实地引用定义函数的类中的上下文。使用 ReflectionFunction::invokeArgs() 似乎没有保留其原始上下文——是的,即使您在调用之前绑定匿名函数。我建议在上下文是一个问题时使用 call_user_func_array()。
我遇到了一个关于 ReflectionFunction 的奇怪问题,在 PHP 错误报告的第 44139 号票中描述。
如果由于某种原因您需要使用 invoke 或 invokeArgs 调用像 array_unshift(它在内部通过引用接受数组)这样的函数,您可以使用以下代码来避免生成的警告或致命错误。
<?php
function unshift(){
$ref = new ReflectionFunction('array_unshift');
$arguments = func_get_args();
return $ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
}
?>
我不了解性能(您也可以手动创建数组,从 array(&$this->something) 开始并添加参数)。但是,它似乎运行良好,没有任何问题,至少在通过引用的发送可以使用单个值之前……