是否需要在物体前面使用&符号?

时间:2014-01-11 04:09:17

标签: php oop object reference php-internals

由于现在默认情况下通过引用传递对象,在&$obj有意义的情况下可能会出现一些特殊情况吗?

2 个答案:

答案 0 :(得分:10)

对象使用不同的引用机制。 &$object更多是参考文献的参考。你无法真正比​​较它们。 见Objects and references

  

PHP引用是一个别名,它允许两个不同的变量写入相同的值。从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,该副本指向同一个对象。

&$object不是$object。我给你举个例子:

foreach ($objects as $object) {
    if ($cond) {
        $object = new Object(); // This won't affect $objects

    }
}

foreach ($objects as &$object) {
    if ($cond) {
        $object = new Object(); // This will affect $objects

    }
}

如果有意义,或者有必要,我不会回答这个问题。这些是基于意见的问题。你绝对可以在没有对象的&引用的情况下生存,就像没有对象一样。两种机制的存在是PHP向后兼容的结果。

答案 1 :(得分:0)

有些情况下你会添加&在函数名称前面,返回任何值作为参考。

要调用这些功能,我们需要添加&在对象面前。

如果我们添加&在对象前面,然后它将返回值作为引用,否则它将只返回该变量的副本。

class Fruit() {

    protected $intOrderNum = 10;

    public function &getOrderNum() {
        return $this->intOrderNum;
    }
}

class Fruitbox() {

   public function TestFruit() {
      $objFruit = new Fruit();
      echo "Check fruit order num : " . $objFruit->getOrderNum(); // 10

      $intOrderNumber = $objFruit->getOrderNum();
      $intOrderNumber++;
      echo "Check fruit order num : " . $objFruit->getOrderNum(); // 10

      $intOrderNumber = &$objFruit->getOrderNum();
      $intOrderNumber++;
      echo "Check fruit order num : " . $objFruit->getOrderNum(); // 11
   }    
}