提问人:cambraca 提问时间:10/7/2011 更新时间:10/7/2011 访问量:90
函数中的可变长度 by-ref 参数列表
Variable-length by-ref argument lists in functions
问:
在 PHP 中,您可以这样做:
function something() {
foreach (func_get_args() as $arg)
echo $arg;
}
something(1, 3); //echoes "13"
这适用于按值传递的参数,但是如果我希望通过引用传递它们怎么办?喜欢这个:
function something_else() {
foreach (func_get_args() as $arg)
$arg *= 2;
}
$a = 1;
$b = 3;
something_else($a, $b);
echo $a . $b; //should echo "26", but returns "13" when I try it
这在 PHP 中可能吗?
答:
1赞
Martin Dimitrov
10/7/2011
#1
不。你不能。ref 传递的 prameter 的声明显式为 。如果你在编译时不知道参数的数量,你可以做这样的事情:function something(&$arg1, &$arg2)
function something_else($args) {
foreach ($args as $arg)
$GLOBALS[$arg] *= 2;
}
$a = 1;
$b = 3;
something_else(array('a', 'b'));
echo $a . $b; //returns "26"
基本上,代码将函数将要修改的参数的名称传递给函数。 保存对脚本全局作用域中所有已定义变量的引用。这意味着,如果调用来自另一个函数,它将不起作用:$GLOBALS
function something_else($args) {
foreach ($args as $arg)
$GLOBALS[$arg] *= 2;
}
function other_function(){
$a = 1;
$b = 3;
something_else(array('a', 'b'));
echo $a . $b; //returns "13"
}
other_function();
触发通知、未定义的索引和 .因此,另一种方法是创建一个数组,其中包含对函数将修改为的变量的引用:a
b
function something_else($args) {
foreach ($args as &$arg)
$arg *= 2;
}
function other_fucntion(){
$a = 1;
$b = 3;
something_else(array(&$a, &$b));
echo $a . $b; //returns "26"
}
other_fucntion();
请注意在线。因此,不需要创建遍历数组的新变量。此功能需要 PHP > 5。&
foreach
评论
0赞
cambraca
10/7/2011
我真的不想使用$GLOBALS,如果传递单个数组是唯一的解决方案,那么 salathe 的答案要干净得多。
0赞
Martin Dimitrov
10/7/2011
这完全是一样的想法。我只是指出了$GLOBALS
2赞
salathe
10/7/2011
#2
这个问题看起来很可怕,但让我们幽默一下。下面是一个可怕的黑客,但你可以发送一个包含你想要处理的项目的参数。
function something_else($args) {
foreach ($args as &$arg) {
$arg *= 2;
}
}
$a = 1;
$b = 3;
something_else(array(&$a, &$b));
echo $a . $b; // 26
评论
0赞
cambraca
10/7/2011
嗯,这是一个想法......只是出于好奇,你知道这在其他语言中是否可行吗?
1赞
newacct
10/7/2011
#3
你可以这样做,但它使用调用时通过引用传递,这在 PHP 5.3 中已被弃用:
function something_else() {
$backtrace = debug_backtrace();
foreach($backtrace[0]['args'] as &$arg)
$arg *= 2;
}
$a = 1;
$b = 3;
something_else(&$a, &$b);
echo $a . $b;
评论