27

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

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

4

5 回答 5

19

PHP 5.6 引入了支持传递引用的新可变参数语法。(感谢@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 个参数传递给函数是不好的做法;)

于 2009-12-20T12:38:42.840 回答
8

PHP 5.6 引入了一种支持传递引用的新可变参数语法。给函数的最后一个参数加上前缀 将其...声明为一个数组,该数组将保存从该点开始的任何实际参数。...可以通过进一步为标记添加前缀来声明该数组以保存引用&,就像对其他参数所做的那样,有效地使参数通过引用传递。

示例 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
于 2014-10-26T23:59:10.460 回答
1

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


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

于 2009-12-17T23:20:58.383 回答
0

有可能的:

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

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

test(&$test, &$test2);

但是,这使用了已弃用的调用时按引用传递。

于 2011-08-12T08:49:01.860 回答
-1

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

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

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

然后在功能中您只需

myfunction ($arguments) {

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

}

数组也可以嵌套。

于 2009-12-17T23:25:07.990 回答