PHP:变长参数列表通过引用传递?

27

是否可以创建一个PHP函数,接收可变数量的参数并且所有参数都通过引用传递?

对我来说,接收值数组的引用或者将参数封装在对象中的函数都没有什么帮助,因为我正在处理函数组合和参数绑定。不要考虑调用时的引用传递。那东西根本不应该存在。


1
你的问题有点不清楚...主要是因为有一些缺失的单词和标点符号。 - Tyler Carter
如果您想要一个引用数组(指向其他变量),那么我不确定 PHP 是否可以做到这一点(?)。 - Steven
也许原帖作者应该回来重新表述问题,这样我们才能真正回答它 :) - user103219
1
也许你可以举个例子,说明为什么传递一个数组或包装元素的对象不适合你。 - Juan
顺便提一下,PHP 5.6有一个新的“展开运算符”https://dev59.com/aHM_5IYBdhLWcg3wUxjF#21387043 - Pacerier
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个参数本身就是不好的做法 ;)

是的,我考虑过这样做。目前看来这似乎是唯一的解决办法。虽不太优雅,但确实有效。 - GetFree
然而,这些参数必须通过引用发送,并且不允许使用表达式。不是很方便。 - AbiusX
"PHP在5.6版本之后已经有了关于变量参数的引用内置函数。请查看下面Outis的回答。" - Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

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

示例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

需要注意的是,在 foreach ($args as $k => $v) 中,在 $v 前面没有使用 & 对我来说也可以工作。 - Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

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


0

这是可能的:

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

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

test(&$test, &$test2);

然而,这使用了已被弃用的按引用传递调用时间。


-1

编辑:抱歉我没有看到你想要它们成为引用...你只需要将它们作为对象传递即可。

你也可以将它们作为数组传递,例如:

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

然后在函数中你只需要

myfunction ($arguments) {

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

}

数组也可以嵌套。


我其实还不确定你想问什么,但我希望我理解得正确。 - user103219
问题很简单。难的是解释为什么将参数包装在数组或对象中传递不能满足我的需求(这与参数绑定和函数组合有关)。 - GetFree
这不是正确的!在PHP中,数组是按值传递的。 - Victor Schröder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接