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

我似乎记得,在 PHP 中有一种方法可以将数组作为函数的参数列表传递,并将数组解引用为标准的 func($arg1, $arg2)方式。但现在我迷失了方向。我记得通过引用传递的方式,如何“通过”传入参数... ... 但不记得如何将数组从列表中删除到参数列表中。

它可能像 func(&$myArgs)一样简单,但我很肯定它不是。但遗憾的是,到目前为止 php.net 手册还没有透露任何信息。并不是说在过去一年左右的时间里我必须使用这个特殊的功能。

120447 次浏览

还要注意,如果要将实例方法应用于数组,则需要将函数作为:

call_user_func_array(array($instance, "MethodName"), $myArgs);

为了完整起见,从 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

对于方法,您使用 RefectionMethod: : invkeArgs 反射方法: : 调用 Args代替,并将对象作为第一个参数传递。

正如前面提到的 ,从 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'

注意: 数组项通过它们在数组中的 位置 < em > 映射到参数,而不是它们的键。

根据 CarlosCarucce 的评论,这种形式的参数在所有情况下解包 是目前为止最快的方法。在一些比较中,它比 call_user_func_array快5倍以上。

让开

因为我认为这非常有用(尽管与问题没有直接关系) : 您可以在函数定义中使用 键入-提示分裂操作符参数来确保所有传递的值都匹配特定的类型。

(只要记住这样做它 必须的是您定义的 最后参数,并且它将传递给函数的所有参数打包到数组中。)

这对于确保数组包含特定类型的项非常有用:

<?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);