在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中可能吗?
这个问题看起来很可怕,但是让我们幽默一下。下面是一个糟糕的hack,但是你可以发送一个包含你想要处理的项目的参数。
function something_else($args) {
foreach ($args as &$arg) {
$arg *= 2;
}
}
$a = 1;
$b = 3;
something_else(array(&$a, &$b));
echo $a . $b; // 26
No。你不能。ref传递的参数声明显式为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();
注意foreach
行中的&
。这样就不需要在数组上创建一个迭代的新变量。这个特性需要PHP> 5
你可以这样做,但它使用的是调用时间通过引用传递,这在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;