【问题标题】:how to pass unlimited arguments by reference in php [duplicate]如何在php中通过引用传递无限参数[重复]
【发布时间】: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);

【问题讨论】:

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


    【解决方案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
        }
        

        【讨论】:

        • 请记住,虽然这些参数是按引用的,但它们不会修改发送给函数的原始参数,而是会按引用发送。
        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 2017-03-21
        • 2014-03-17
        • 2018-02-21
        • 2013-01-12
        • 2013-05-16
        • 2021-12-11
        相关资源
        最近更新 更多