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

时间:2009-12-17 23:12:14

标签: php pass-by-reference parameter-passing variadic-functions function-parameter

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

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

5 个答案:

答案 0 :(得分:13)

PHP 5.6引入了new variadic syntax,它支持pass-by-reference。 (感谢@outis的更新)

function foo(&...$args) {
    $args[0] = 'bar';
}

对于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
}

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

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

答案 1 :(得分:6)

PHP 5.6引入了一个支持pass-by-reference的new variadic syntax。将最后一个参数前缀为具有...的函数将其声明为一个数组,该数组将保存该点上的任何实际参数。可以通过在...标记前面添加&来声明数组来保存引用,就像对其他参数一样,有效地使参数传递给ref。

示例1:

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

示例2:

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

答案 2 :(得分:0)

您应该能够传递包装在对象中的所有参数。


Class A
{
    public $var = 1;
}

function f($a)
{
    $a->var = 2;
}

$o = new A;
printf("\$o->var: %s\n", $o->var);
f($o);
printf("\$o->var: %s\n", $o->var);

应该打印 1 2

答案 3 :(得分:0)

编辑:抱歉,我没有看到你希望它们成为引用....所有你需要做的就是将它们作为一个对象传递。

您也可以在数组中传递它们,例如

myfunction(array('var1' => 'value1', 'var2' => 'value2'));

然后在函数中你只是

myfunction ($arguments) {

echo $arguments['var1'];
echo $arguments['var2'];

}

阵列也可以嵌套。

答案 4 :(得分:0)

有可能:

$test = 'foo';
$test2 = 'bar';

function test(){
    $backtrace = debug_backtrace();
    foreach($backtrace[0]['args'] as &$arg)
        $arg .= 'baz';
}

test(&$test, &$test2);

但是,这使用了不推荐使用的call-time pass by reference。