ReflectionFunction::invokeArgs()
(PHP 5 >= 5.1.2, PHP 7)
Invokes function args
说明
public ReflectionFunction::invokeArgs(array $args): mixed
Invokes the function and pass its arguments as array.
参数
- $args
The passed arguments to the function as an array, much likecall_user_func_array()works.
返回值
Returns the result of the invoked function
范例
Example #1ReflectionFunction::invokeArgs()example
<?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
Example #2ReflectionFunction::invokeArgs()with references example
<?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) }
注释
Note:如果函数有参数需为引用,那么它们必须以引用方式传入。
参见
- ReflectionFunction::invoke() Invokes function
- ReflectionFunctionAbstract::getNumberOfParameters() 获取参数数目
- __invoke()
call_user_func_array()
调用回调函数,并把一个数组参数作为回调函数的参数
In the case of call_user_func_array(), if you were to pass around an anonymous function and reference $this within the anonymous function, $this will faithfully refer to the class in the context in which the function was defined. Using ReflectionFunction::invokeArgs() does not seem to retain its original context--yeah, even if you bind the anonymous function before invoking. I recommend call_user_func_array() where context is a concern.
I encountered a weird problem with ReflectionFunction, described in ticket 44139 of PHP Bugs. If for some reason you need to call with invoke, or invokeArgs, a function like array_unshift (that accepts internally the array by reference) you could use this code to avoid the generated warning or fatal error. <?php function unshift(){ $ref = new ReflectionFunction('array_unshift'); $arguments = func_get_args(); return $ref->invokeArgs(array_merge(array(&$this->arr), $arguments)); } ?> I don't know about performances (you can create an array manually too, starting from array(&$this->something) and adding arguments). However, it seems to work correctly without problems, at least until the send by reference will be usable with one single value ...