【问题标题】:Is there ever a need to use ampersand in front of an object?是否需要在对象前面使用 & 符号?
【发布时间】:2014-01-30 06:14:07
【问题描述】:

由于现在默认情况下对象是通过引用传递的,所以&$obj 是否有意义?

【问题讨论】:

  • 在古老的 php 版本上运行 - 廉价/愚蠢的托管商提供的那种,愉快地运行魔术引号和注册全局变量...应该从轨道上删除的那种安装。跨度>

标签: php oop object reference php-internals


【解决方案1】:

对象使用不同的引用机制。 &$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 向后兼容的结果。

【讨论】:

  • 如果我想通过循环修改数组中的项目。第二个例子比for ($objects as $key=>$value) { $objects[$key] = new Object(); } 更好吗?
  • 代码应该只是指出 & 是一种不同的引用机制。这是否是一个好方法不在这个问题的范围内。
  • 在 PHP4 中,对象不是引用,因此必须使用 $obj = &new MyClass 创建对象。如果你想在函数中修改一个对象,你必须通过引用传递它。
  • 感谢历史背景。但是,我想来这个问题的家伙可能会想知道为什么 PHP-7 仍然有两种不同的引用机制。
【解决方案2】:

在某些情况下,您可以在函数名称前添加 &,以返回任何值作为引用。

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

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

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
   }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多