PHP:通过引用的可变长度参数列表?

Get*_*ree 24 php parameter-passing pass-by-reference variadic-functions function-parameter

是否可以创建一个PHP函数,通过引用获取所有参数的可变数量的参数?

它没有帮助我通过引用接收一个值数组的函数,也没有一个函数将其参数包含在一个对象中,因为我正在处理函数组合和参数绑定.不要考虑呼叫时间传递参考.那东西甚至不应该存在.

Bob*_*ger 16

PHP 5.6引入了支持pass-by-reference的新的可变参数语法.(感谢@outis的更新)

function foo(&...$args) {
    $args[0] = 'bar';
}
Run Code Online (Sandbox Code Playgroud)

对于PHP 5.5或更低版本,您可以使用以下技巧:

function foo(&$param0 = null, &$param1 = null, &$param2 = null, &$param3 = null, &$param4 = null, &$param5 = null) {
  $argc = func_num_args();
  for ($i = 0; $i < $argc; $i++) {
    $name = 'param'.$i;
    $params[] = & $$name;
  }
  // do something
}
Run Code Online (Sandbox Code Playgroud)

缺点是参数的数量受限定的参数数量(示例代码段中为6).但是使用func_num_args()可以检测是否需要更多.

无论如何,将超过7个参数传递给函数是不好的做法;)


out*_*tis 8

PHP 5.6引入了一种支持pass-by-reference 的新的可变参数语法.将最后一个参数添加到函数中,...并将其声明为一个数组,该数组将保存该点上的任何实际参数.可以通过进一步为...令牌添加前缀来声明数组以保持引用&,如对其他参数所做的那样,有效地使参数pass-by-ref.

例1:

function foo(&...$args) {
    $args[0] = 'bar';
}
foo($a);
echo $a, "\n";
#  output:
#a
Run Code Online (Sandbox Code Playgroud)

例2:

function number(&...$args) {
    foreach ($args as $k => &$v) {
        $v = $k;
    }
}
number($zero, $one, $two);
echo "$zero, $one, $two\n";
#  output:
#0, 1, 2
Run Code Online (Sandbox Code Playgroud)