我似乎记得在PHP中有一种方法可以将数组作为函数的参数列表传递,以标准的func($arg1, $arg2)方式取消引用数组。 但是现在我迷失了如何做。 我记得通过引用传递的方式,如何"遍历"传入的参数……但没有如何将数组从列表中除名。
它可能和func(&$myArgs)一样简单,但是我很确定不是。 但是,可悲的是,到目前为止,php.net手册还没有透露任何内容。 并不是说我在过去一年左右的时间里不得不使用此特定功能。
http://www.php.net/manual/zh/function.call-user-func-array.php
我可能发誓说它也是一个无功能的东西,例如前缀字符或其他东西。谢谢。
是的,但是在PHP中不是。在Python中;-)
但是我不知道Python!我一定是意外的心理...:D
所谓的参数解压缩将在PHP 5.6(wiki.php.net/rfc/argument_unpacking)中添加。它将使用splat运算符:...。其语法:$args = [1,2,3]; function(...$args){}
但是,如果您希望调用的函数是对象上的实例方法,而不是全局空间中的函数名,该怎么办?
@ahnbizcad,那么您应该使用callable,它使用相同的call_user_func_array,仅用于数组,其中第一个元素是对象,第二个是方法。例如call_user_func_array([$object, method], $myArgs);
如前所述,从PHP 5.6+起,您可以(应该!)使用...令牌(又称" splat运算符",是可变函数功能的一部分),可以轻松地调用带有参数数组的函数:
function variadic($arg1, $arg2)
{
// Do stuff
echo $arg1.' '.$arg2;
}
$array = ['Hello', 'World'];
// 'Splat' the $array in the function call
variadic(...$array);
// 'Hello World'
注意:数组项是根据其在数组中的位置而不是其键映射到参数的。
根据CarlosCarucce的评论,这种形式的参数解压缩是迄今为止所有情况下最快的方法。在某些比较中,它比call_user_func_array快5倍以上。
在旁边
因为我认为这确实有用(尽管与问题没有直接关系):您可以在函数定义中键入splat运算符参数,以确保所有传递的值都与特定类型匹配。
(请记住,这样做必须是您定义的最后一个参数,并将传递给函数的所有参数捆绑到数组中。)
确保数组包含特定类型的项目非常有用:
// 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相比,这具有很大的性能改进。因此,如果您使用的是php 5.6+,则推荐使用此版本。这是一个测试,在官方php Wiki中被引用
确实不幸的是,这并不是明显的答案。绝对更好
还要注意,如果要将实例方法应用于数组,则需要将该函数传递为:
call_user_func_array(array($instance,"MethodName"), $myArgs);
@understack链接页面上的$foo->bar()示例建议应为array($instance,"MethodName")。
太棒了,我用它来避免在子类中重复构造函数参数:) call_user_func_array(array(parent,"__construct"), func_get_args());
为了完整起见,从PHP 5.1开始,这也适用:
function title($title, $name) {
return sprintf("%s. %s
", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray); // prints"Dr. Phil"
?>
请参阅:http://php.net/reflectionfunction.invokeargs
对于方法,请改用ReflectionMethod :: invokeArgs并将对象作为第一个参数传递。
这实际上是我一直在寻找的!