Поскольку объекты по умолчанию переданы по умолчанию, может ли быть какой-то частный случай, когда &$obj
имеет смысл?
Объекты используют другой ссылочный механизм. &$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 } }