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