2011-08-11 48 views
9

中传递无限参数我有php函数有无限数量的参数,我从func_get_args()获得。我有一些操作参数(改变字符串或做某事),我希望这是一个通过引用传递参数。可能吗?如何通过参考在php

例如:

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

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

test($test, $test2); 
+0

[PHP?:通过参照可变长度参数列表]的可能的复制(http://stackoverflow.com/questions/1925253/php-variable-length-argument-list-by-reference) –

回答

4

我很怀疑这是可能的,但我知道你可以得到一个方式,你想要什么:

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

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

它看起来我们很快就可以在PHP 5.6中使用新的'...'运算符来完成这项工作。 –

1

这工作:

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

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

test(&$test, &$test2); 

然而,它使用不建议使用的引用时间传递参考。

+0

根本不允许在PHP 5.4+中使用 –

12

如在PHP: variable-length argument list by reference?中回答的,PHP中没有办法将变长和传递引用函数参数结合起来。相反,链接的答案使用声明100 &argx s的破解,然后使用get_num_args()来计算实际使用的数量。恭喜,你发现PHP中一个特别困难的角落;)

0

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

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

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

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

我爱[]寿,更好:)

+1

您只传递一个参数,它是一个数组(并且在

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

由于PHP-5.6,你可以使用一个variadic参考:

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

完美无缺和5.6的支持,不能更喜欢这个答案,谢谢你的更新! –

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

请记住,虽然这些参数是引用参考,但它们不会修改发送给该函数的原始参数,但它们将通过参考发送。 – AbiusX

0

在做类似下面的例子时适合我。我认为关键在于设定参考。

$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); 
    } 

}