如何在php中通过引用传递无限参数

时间:2011-08-11 13:39:48

标签: php function variables arguments pass-by-reference

我有一个php函数,它具有无限数量的args,我从func_get_args()获得。我有一些带参数的操作(改变字符串或做某事),我希望它像引用的传递参数。有可能吗?

示例:

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

function test(){
    $args = func_get_args();
    foreach($args as $arg)
        $arg .= 'baz';
}

test($test, $test2);

8 个答案:

答案 0 :(得分:14)

从PHP-5.6开始,您可以使用variadic引用:

function test(&...$args) {
    foreach ($args as &$arg) {
        $arg .= 'baz';
    }
}

答案 1 :(得分:12)

正如在PHP: variable-length argument list by reference?中所回答的那样,PHP中没有办法组合变长和传递引用函数参数。相反,链接的答案使用声明100 &argx s的hack,然后使用get_num_args()来确定实际使用了多少{{1}}。恭喜,你在PHP中发现了一个特别困难的角落;)

答案 2 :(得分:5)

我非常怀疑这是可能的,但我确实知道一种方法可以得到你想要的东西:

function test(&$args) {
    foreach ($args as $arg) {
        $arg .= 'baz';
    }
}

test(array(&$test, &$test2));

答案 3 :(得分:1)

这有效:

$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。

答案 4 :(得分:1)

在做类似下面的示例时,对我来说很好。我认为关键是在foreach中设置参考。

$var1 = '%DIR%/test';

replaceParameters(
    $var1, 
    $var2, 
    $var3
);

function replaceParameters(&$variables) {

    $variables = array_filter(func_get_args());

    $parameters = [
        '%DIR%' => __DIR__, 
        '%FILE%' => __FILE__,
    ];

    foreach($variables as &$variable) {
        $variable = str_replace(array_keys($parameters), array_values($parameters), $variable);
    }

}

答案 5 :(得分:0)

我也需要这个功能,我提出了一个解决方案。

function sayhello($params) {
    //params hold an unlimited amount of references
}

sayhello([&$one, &$two]);

这取决于php> = 5.4。如果您使用< = 5.4,请使用array()语法而不是[]。

我爱[] tho,好多了:)。

答案 6 :(得分:0)

使用对象是解决方案

class O {
    public $v;
    public function __construct(&$p){
        $this->v = &$p;
    }
}

function append_baz_to_all(){
    foreach(func_get_args() as &$arg){
        $arg->v .= 'baz';
    }
}

function test1(){
    echo "test1\n";
    $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G';
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n");
    append_baz_to_all(new O($a), new O($b));
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n");
}

//shortcutting
function o(&$v){return new O($v);}

function test2(){
    echo "test2\n";
    $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G';
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n");
    append_baz_to_all(o($c), o($d), o($e));
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n");
}


test1();
test2();

答案 7 :(得分:0)

function byref_alias()
{
 //$argz=func_get_args(); //byval, not what you want
 $argz=debug_backtrace()[0]['args']; //byref hack
 $argz[0]++; works
}