如何在php中通过引用传递无限参数[重复]

Posted

技术标签:

【中文标题】如何在php中通过引用传递无限参数[重复]【英文标题】:how to pass unlimited arguments by reference in php [duplicate] 【发布时间】:2011-10-25 00:10:55 【问题描述】:

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

示例:

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

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


test($test, $test2);

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

完美支持 5.6,不能再喜欢这个答案了,感谢更新!【参考方案2】:

正如PHP: variable-length argument list by reference? 中所回答的那样,PHP 中无法组合可变长度并通过引用函数参数传递。相反,链接的答案使用声明 100 &argxs 的技巧,然后使用 get_num_args() 来确定实际使用了多少。恭喜,你在 PHP 中找到了一个特别难的角落;)

它还展示了如何使用 PHP 5.6+ 可变参数来做到这一点。

【讨论】:

在 2014 年的 php5.6 之前是准确的。Markus 的答案现在更准确,因为它受支持。【参考方案3】:

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

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


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

【讨论】:

看起来我们很快就能使用 PHP 5.6 中的新 ... 运算符来做到这一点。【参考方案4】:

这行得通:

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

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


test(&$test, &$test2);

但是,这使用了已弃用的调用时按引用传递。

【讨论】:

在 PHP 5.4+ 中根本不允许【参考方案5】:

在执行以下示例时对我来说效果很好。我认为关键是在 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);
    


【讨论】:

【参考方案6】:

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

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


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

这取决于 php >= 5.4。如果您使用的是

我爱 [] 寿,好多了 :)

【讨论】:

您只传递了一个参数,它是一个数组(并且在 【参考方案7】:

使用对象是解决方案

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();

【讨论】:

【参考方案8】:
function byref_alias()

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

【讨论】:

请记住,虽然这些参数是按引用的,但它们不会修改发送给函数的原始参数,而是会按引用发送。

以上是关于如何在php中通过引用传递无限参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 PHP 中通过引用传递变量来存储变量?

在 C 中通过引用传递时会发生啥?

如何在 Ruby 中通过引用传递?

为啥在 PHP 中通过引用传递?

何时在 PHP 中通过引用传递

在静态类方法中通过引用传递参数