PHP Conference Japan 2024

ReflectionFunction::invokeArgs

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

ReflectionFunction::invokeArgs调用函数参数

描述

public ReflectionFunction::invokeArgs(数组 $args): 混合

调用函数并将其参数作为数组传递。

参数

args

作为数组传递给函数的参数,类似于 call_user_func_array() 的工作方式。

返回值

返回被调用函数的结果

变更日志

版本 描述
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)
}

注释

注意:

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

参见

添加注释

用户贡献的注释 2 条注释

theyourcomputer at gmail dot com
7 年前
在 call_user_func_array() 的情况下,如果您要传递一个匿名函数并在匿名函数中引用 $this,则 $this 将忠实地引用函数定义所在类的上下文。使用 ReflectionFunction::invokeArgs() 似乎不会保留其原始上下文——是的,即使您在调用之前绑定了匿名函数。我建议在上下文是一个问题的情况下使用 call_user_func_array()。
Andrea Giammarchi
16 年前
我在 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) 开始并添加参数)。但是,它似乎可以正常工作,至少在通过引用的方式可以使用单个值之前……
To Top