Оператор присваивания ссылок в PHP, = &

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