Оператор присвоєння довідок у 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 Нічого собі! Тепер символhound постійно додається до моєї панелі інструментів.
Parapluie

26

Це два різні оператори. =це призначення, як ви, мабуть, знаєте. І &означає, що до змінної слід звертатися за посиланням, а не за значенням.


60
Вибачте, але це занадто спрощено. $ a = & $ b означає зробити змінну $ a посиланням на те саме, що зараз робить $ b. Після цього $ a = 5; також призведе до того, що $ b матиме 5. Однак посилання може бути розірвано на $ b = & $ xyz; або скасувати ($ b); У той час $ a буде єдиною змінною, яка знає, де знаходиться клітина, яка містить 5. Також слід пам’ятати, що якщо ви встановите $ a з використанням = &, ви повинні використовувати = & наступного разу (або вимкнути ($ a)), щоб змінити посилання на $ a, конкретно $ a = NULL; не порушить посилання, він лише замінить 5 на нуль;
День

8
@Don: Дякую за розробку. Я можу сказати, що ви програміст на С.
Асаф

8
Я другий, що каже Дон. Але я б не сказав, що це занадто спрощено. Я б сказав, що це неправильно.
Артефакто

@Не дійсно ви повинні опублікувати свій коментар як відповідь.
Адам

7
$x = &$y['z'];

також має наслідком створення, $y['z']якщо воно не існує, і встановлення його на null.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.