Answers:
http://www.php.net/manual/zh/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
$args = [1,2,3]; function(...$args){}
callable
,它call_user_func_array
仅在第一个元素是对象而第二个是方法的数组中使用相同的。例如call_user_func_array([$object, 'method'], $myArgs);
如前所述,从PHP 5.6+开始,您可以(应该!)使用...
令牌(即splat运算符,可变参数函数功能的一部分)来轻松地调用带有参数数组的函数:
<?php
function variadic($arg1, $arg2)
{
// Do stuff
echo $arg1.' '.$arg2;
}
$array = ['Hello', 'World'];
// 'Splat' the $array in the function call
variadic(...$array);
// 'Hello World'
注意:数组项是根据其 在数组中的位置 而不是其键映射到参数的。
根据CarlosCarucce的评论,这种形式的参数解压缩是迄今为止所有情况下最快的方法。在某些比较中,它比快5倍以上call_user_func_array
。
因为我认为这确实有用(尽管与问题没有直接关系):您可以在函数定义中键入提示splat运算符参数,以确保所有传递的值都与特定类型匹配。
(请记住,这样做必须是您定义的最后一个参数,并将传递给函数的所有参数捆绑到数组中。)
这对于确保数组包含特定类型的项非常有用:
<?php
// Define the function...
function variadic($var, SomeClass ...$items)
{
// $items will be an array of objects of type `SomeClass`
}
// Then you can call...
variadic('Hello', new SomeClass, new SomeClass);
// or even splat both ways
$items = [
new SomeClass,
new SomeClass,
];
variadic('Hello', ...$items);
还要注意,如果要将实例方法应用于数组,则需要将该函数传递为:
call_user_func_array(array($instance, "MethodName"), $myArgs);
call_user_func_array(array(parent, "__construct"), func_get_args());
为了完整起见,从PHP 5.1开始,这也适用:
<?php
function title($title, $name) {
return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray); // prints "Dr. Phil"
?>
请参阅:http://php.net/reflectionfunction.invokeargs
对于方法,请改用ReflectionMethod :: invokeArgs并将对象作为第一个参数传递。