Что делает оператор присваивания =& (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 нулевым;