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


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, насколько я знаю.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.