【问题标题】:Is there a need to pass variable by reference in php5?php5中是否需要通过引用传递变量?
【发布时间】:2009-05-19 23:45:14
【问题描述】:

PHP5 使用“写入时复制”并通过引用传递导致性能损失大于收益,为什么我应该使用传递引用?除了会返回多个值的回调函数或您希望在以后不调用 set 函数的情况下更改属性的类(我知道这是不好的做法)之外,我还缺少它的用途吗?

【问题讨论】:

    标签: php pass-by-reference


    【解决方案1】:

    当您想要修改结果时,您可以使用传递引用,仅此而已。

    请记住,PHP 中的对象总是通过引用传递。

    就我个人而言,我发现 PHP 隐式复制值的系统(我想是为了防止意外修改)既麻烦又不直观,但我又开始使用强类型语言,这可能解释了这一点。但我发现对象与 PHP 的正常操作不同,这很有趣,我认为这证明 PHP 的隐式复制机制确实不是一个好的系统。

    【讨论】:

    • Java 的行为与 PHP 的行为相同(对象通过引用传递,原语通过 ["copied"] 值传递),我相信 C++ 也是如此。您指的是哪种强类型语言?
    • Java通过引用传递对象;它复制对象引用的值;见stackoverflow.com/questions/40480/is-java-pass-by-reference
    • 很公平。根据下面 laurentb 的示例,您似乎可以对 PHP 说同样的话,这只会强化我的观点:在 PHP 和 Java 中传递参数的方式几乎无法区分。我仍在等待一个“强类型语言”的示例,它可以直接复制作为参数传递的对象。
    • @FrankFarmer:问题是,在 Java 和 PHP 5 中,对象都不是值。当你创建一个新对象时,你会得到一个对象引用。如果您查看一种可以将对象作为值并按值传递的语言,例如C++,然后当你传递对象时它会复制它们
    【解决方案2】:

    填充数组的递归函数?记得写一次这样的东西。

    拥有数百个部分填充数组的副本并在每个回合复制、拼接和连接部分是没有意义的。

    【讨论】:

      【解决方案3】:

      即使在传递对象时也有区别。

      试试这个例子:

      class Penguin { }
      
      $a = new Penguin();
      
      function one($a)
      {
        $a = null;
      }
      
      function two(&$a)
      {
        $a = null;
      }
      
      var_dump($a);
      one($a);
      var_dump($a);
      two($a);
      var_dump($a);
      

      结果将是:

      object(Penguin)#1 (0) {}
      object(Penguin)#1 (0) {}
      NULL
      

      当您通过引用传递包含对对象的引用的变量时,您可以修改对该对象的引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        相关资源
        最近更新 更多