Operator przypisania odniesienia w PHP, = &

Odpowiedzi:

121

Nie jest przestarzały i raczej nie będzie. Jest to standardowy sposób, na przykład, aby część jednej tablicy lub obiektu lustrzanego zmian wprowadzonych do innej, zamiast kopiować istniejące dane.

Nazywa się to przypisaniem przez odniesienie , co, cytując podręcznik, „oznacza, że ​​obie zmienne wskazują w końcu te same dane i nic nie jest nigdzie kopiowane” .

Jedyną rzeczą, która jest przestarzała, =&jest „przypisywanie wyniku newprzez referencję” w PHP 5 , co może być źródłem wszelkich nieporozumień. newjest automatycznie przypisywany przez odniesienie, więc &jest zbędny / przestarzały w $o = &new C;, ale nie w $o = &$c;.


Ponieważ wyszukiwanie jest trudne, zwróć uwagę, że =&( równa się ampersand ) oznacza to samo, co = &( równa się spacja ampersand ) i często jest zapisywane w taki sposób, że przechodzi do innej zmiennej, takiej jak $x = &$y['z'];lub $x = &$someVar( znak ampersand nazwa zmiennej ze znakiem dolara ). Przykład uproszczony z dokumentów:

$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4

Oto przydatne łącze do szczegółowej sekcji Przypisz przez odniesienie w podręczniku PHP . Ta strona jest częścią serii o referencjach - warto poświęcić chwilę na przeczytanie całej serii.

user56reinstatemonica8
źródło
8
uwaga dodatkowa: „ponieważ trudno jest wyszukiwać” : symbolhound.com jest twoim przyjacielem w takich rzeczach.
billynoah
1
@billynoah Wow! symbolhound jest teraz na stałe dodany do mojego zestawu narzędzi.
Parapluie
26

To dwóch różnych operatorów. =to zadanie, jak zapewne wiesz. I &oznacza, że zmienna powinna być dostępna przez odniesienie zamiast przez wartość.

Asaf
źródło
60
Przepraszam, ale to zbyt uproszczone. $ a = & $ b oznacza, że ​​zmienna $ a odnosi się do tego samego, co teraz robi $ b. Następnie $ a = 5; spowoduje również, że $ b będzie mieć 5. Jednakże łącze referencyjne może zostać podzielone przez $ b = & $ xyz; lub nieustawiony ($ b); W tym momencie $ a będzie jedyną zmienną, która wie, gdzie znajduje się komórka przechowująca 5. Uważaj również, że jeśli ustawisz $ a using = &, musisz użyć = & następnym razem (lub unset ($ a)), aby zmienić odnośnik do $ a, a konkretnie $ a = NULL; nie zerwie łącza, zastępuje tylko 5 wartością null;
Don
8
@Don: Dzięki za opracowanie. Mogę powiedzieć, że jesteś programistą C.
Asaph,
8
Popieram to, co mówi Don. Ale nie powiedziałbym, że jest to zbyt uproszczone. Powiedziałbym, że to źle.
Artefacto
@Naprawdę powinieneś zamieścić swój komentarz jako odpowiedź.
Adam
7
$x = &$y['z'];

ma również wpływ na tworzenie, $y['z']jeśli nie istnieje, i ustawienie go na null.

Zapobiega to wyświetlaniu komunikatów o błędach, które chciałbyś przeczytać. Nie znalazłem jeszcze dokumentacji na ten temat; prawdopodobnie nowy w 5.3, o ile wiem.

malcanso
źródło