Что делает оператор присваивания =&
(equals-амперсанд) в PHP?
Это устарело?
Это не устарело и вряд ли будет. Это стандартный способ, например, сделать часть одного или нескольких зеркальных изменений объектов, сделанных для другого, вместо копирования существующих данных.
Это называется присвоением по ссылке , которое, цитируя руководство, означает, что обе переменные в конечном итоге указывают на одни и те же данные, и ничто не копируется в любом месте » .
Единственное, что устарело, с =&
– «присваивать результат new
по ссылке» в PHP 5 , что может быть источником какой-либо путаницы. new
автоматически присваивается ссылкой, поэтому &
является избыточным / устаревшим в $o = &new C;
, но не в $o = &$c;
,
Заметьте, что =&
( равно амперсандам ) совпадает с = &
( равно амперсанду пространства ) и часто записывается так, что он попадает в другую переменную, как $x = &$y['z'];
или $x = &$someVar
( имя переменной амперсанда и знака доллара ). Пример упрощен из документов:
$a = 3; $b = &$a; $a = 4; print "$b"; // prints 4
Вот удобная ссылка на подробный раздел « Назначение по ссылке» в руководстве по PHP . Эта страница является частью серии по ссылкам – стоит потратить минуту, чтобы прочитать всю серию.
Это два разных оператора. =
задание, как вы, вероятно, знаете. И &
означает, что к переменной следует обращаться по ссылке, а не по значению.
$x = &$y['z'];
также имеет эффект создания $y['z']
если он не существует, и устанавливает его в null
.
Это предотвращает сообщения об ошибках, которые вы, возможно, хотели прочитать. Я еще не нашел документацию по этому поводу; возможно, новый в 5.3, насколько я знаю.
Цитата @ комментарий Дон здесь, так как это хорошо объясненный ответ на этот вопрос.
Извините, но это слишком упрощенно. $ a = & $ b означает, что переменная $ a относится к той же вещи, что и $ b. После этого $ a = 5; также приведет к $ b, имеющему 5.
Однако эталонная ссылка может быть разбита на $ b = & $ xyz; или unset ($ b); В это время $ a будет единственной переменной, которая знает, где ячейка содержит 5.
Также будьте осторожны, если вы установите $ a using = &, вы должны использовать = и в следующий раз (или unset ($ a)), чтобы изменить ссылку ссылки $ a, в частности $ a = NULL; не нарушит ссылку, она заменяет только 5 нулевым;