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

Ответы:

121

Это не устарело и вряд ли станет устаревшим. Это стандартный способ, например, внести в один массив или объект зеркальные изменения, внесенные в другой, вместо копирования существующих данных.

Это называется присвоением по ссылке , что, если цитировать руководство, «означает, что обе переменные в конечном итоге указывают на одни и те же данные, и ничего никуда не копируется» .

Единственное , что является устаревшим с =&является «присвоение результата в 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 . Эта страница является частью серии ссылок - стоит потратить минуту, чтобы прочитать всю серию.

user56reinstatemonica8
источник
8
примечание к стороне re: "так как это трудно искать" : symbolhound.com - ваш друг для подобных вещей.
billynoah
1
@billynoah Вау! symbolhound теперь постоянно добавлен в мой набор инструментов.
Parapluie
26

Это два разных оператора. =это назначение, как вы, наверное, знаете. И &означает, что к переменной следует обращаться по ссылке, а не по значению.

Асаф
источник
60
Извините, но это слишком упрощенно. $ a = & $ b означает, что переменная $ a ссылается на то же, что сейчас делает $ b. После этого $ a = 5; также приведет к тому, что $ b будет иметь 5. Однако ссылка на ссылку может быть разорвана на $ b = & $ xyz; или не установлено ($ b); В этот момент $ a будет единственной переменной, которая знает, где находится ячейка, содержащая 5. Также помните, что если вы установите $ a с помощью = &, вы должны использовать = & в следующий раз (или unset ($ a)), чтобы изменить ссылка на ссылку $ a, а именно $ a = NULL; не разрывает ссылку, а только заменяет 5 на ноль;
Дон
8
@Don: Спасибо за разработку. Я могу сказать, что вы программист на C.
Asaph
8
Я поддерживаю то, что говорит Дон. Но я бы не сказал, что это слишком упрощенно. Я бы сказал, что это неправильно.
Artefacto,
@Don, вы действительно должны опубликовать свой комментарий в качестве ответа.
Adam
7
$x = &$y['z'];

также имеет эффект создания, $y['z']если он не существует, и установки для него значения null.

Это предотвращает сообщения об ошибках, которые вы могли бы захотеть прочитать. Я еще не нашел документации по этому поводу; возможно, новое в версии 5.3, насколько я знаю.

Малькансо
источник