Есть ли необходимость использовать амперсанд перед объектом?

Так как объекты теперь передаются по ссылке по умолчанию, возможно, существует особый случай, когда &$obj будет иметь смысл?

2 ответа

Решение

Объекты используют другой механизм ссылок. &$object это больше ссылка на ссылку. Вы не можете действительно сравнить их обоих. Смотрите объекты и ссылки:

Ссылка 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.

Есть ситуации, когда вы добавляете & перед именем функции, чтобы вернуть любое значение в качестве ссылки.

Чтобы вызвать эти функции, нам нужно добавить & перед объектом.

Если мы добавим & перед объектом, то он вернет значение в качестве ссылки, в противном случае он вернет только копию этой переменной.

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
   }    
}
Другие вопросы по тегам