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