2011-08-11 40 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); 
    } 

}