在PHP中将数组作为参数传递,而不是数组

Rob*_*t K 142 php arrays methods function

我似乎记得在PHP中有一种方法可以将数组作为函数的参数列表传递,将数组解引用为标准func($arg1, $arg2)方式.但是现在我迷失了怎么做.我记得通过引用传递的方式,如何"传递"传入的参数...但不是如何将数组取消列表到参数列表.

它可能很简单func(&$myArgs),但我很确定不是这样.但是,遗憾的是,到目前为止,php.net手册尚未透露任何内容.并非我在过去一年左右不得不使用这一特定功能.

var*_*tec 173

http://www.php.net/manual/en/function.call-user-func-array.php

call_user_func_array('func',$myArgs);
Run Code Online (Sandbox Code Playgroud)

  • 所谓的参数解包,将在PHP 5.6(https://wiki.php.net/rfc/argument_unpacking)中添加.它将使用'splat operator':'...'.它的语法:`$ args = [1,2,3]; 功能(...的$ args){}` (42认同)
  • 但我不懂Python!我一定是不小心通灵......:D (8认同)
  • @ahnbizcad然后你应该使用`callable`,它使用相同的`call_user_func_array`,只使用第一个元素是对象的数组,第二个是方法.例如`call_user_func_array([$ object,'method'],$ myArgs);` (6认同)
  • 但是,如果要调用的函数是对象的实例方法,而不是全局空间中的函数名称,该怎么办? (4认同)

sim*_*amp 131

正如已经提到的,从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'
Run Code Online (Sandbox Code Playgroud)

注意:数组项通过它们 在数组中位置 而不是它们的键映射到参数.

根据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);
Run Code Online (Sandbox Code Playgroud)

  • 与`call_user_func_array`相比,这有很大的性能提升.所以,如果您使用的是PHP 5.6+,我会推荐这个.[这是一个测试](https://gist.github.com/nikic/6390366),在[官方php wiki]中引用(https://wiki.php.net/rfc/argument_unpacking) (7认同)
  • 真的很不幸,这不是标记的答案。绝对更好 (2认同)

Jef*_*ber 81

另请注意,如果要将实例方法应用于数组,则需要将该函数传递为:

call_user_func_array(array($instance, "MethodName"), $myArgs);
Run Code Online (Sandbox Code Playgroud)

  • 真棒,我使用它来避免在子类中复制构造函数参数:)`call_user_func_array(array(parent,"__ construct"),func_get_args());` (11认同)
  • @understack [链接页面]上的`$ foo-> bar()`示例(http://www.php.net/manual/en/function.call-user-func-array.php)表明它应该是`array($ instance,"MethodName")`. (4认同)

Dan*_*Man 10

为了完整起见,从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"
?>
Run Code Online (Sandbox Code Playgroud)

请参阅:http://php.net/reflectionfunction.invokeargs

对于方法,您可以使用ReflectionMethod :: invokeArgs,并将对象作为第一个参数传递.