Reference assignment operator in PHP, =&
Co robi operator przypisania =&
(equals-ampersand) w PHP?
4 answers
Nie jest przestarzały i raczej nie będzie. Jest to standardowy sposób, na przykład, aby część jednej tablicy lub obiektu odzwierciedlała zmiany dokonane na innej, zamiast kopiować istniejące dane.
Nazywa się to przypisaniem przez odniesienie , co, cytując podręcznik, "oznacza, że obie zmienne wskazują te same dane, a nic nie jest nigdzie kopiowane" .
Jedyną rzeczą, która jest jest " przypisanie wyniku new
przez odniesienie " w PHP 5 , które może być źródłem wszelkich nieporozumień. new
jest automatycznie przypisywany przez odniesienie, Więc&
jest redundantny/przestarzały w $o = &new C;
, ale nie w $o = &$c;
.
Ponieważ trudno jest szukać, zauważ, że =&
(równa ampersand ) jest taka sama jak = &
(równa spacji ampersand) i jest często zapisywana w taki sposób, że biegnie do innej zmiennej jak $x = &$y['z'];
lub $x = &$someVar
(ampersand dollar sign variable name ). Przykład uproszczony z docs:
$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4
Oto przydatny link do szczegółowej sekcji przypisanie przez odniesienie w podręczniku PHP. Ta strona jest częścią serii o referencjach-warto poświęcić chwilę na przeczytanie całej serii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 16:13:01
To dwa różne operatory. =
to zadanie, jak zapewne wiesz. I &
oznacza, że zmienna powinna być dostępna przez odniesienie, a nie przez wartość.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 23:36:54
$x = &$y['z'];
Ma również efekt tworzenia $y['z']
, jeśli nie istnieje, i ustawiania go na null
.
Zapobiega to komunikatom o błędach, które mogłeś chcieć przeczytać. Nie znalazłem jeszcze dokumentacji na ten temat; prawdopodobnie nowa w 5.3, z tego co wiem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 23:37:38
Chciałbym zwrócić uwagę na semantykę i stylizację kodu "Przypisywanie przez odniesienie". Pierwsze zdanie OP wskazuje na błędne przekonanie:
Co robi operator przypisania = & (equals-ampersand) w PHP?
Najpierw przejrzyjmy dedykowaną sekcję Strony PHP Docs pod kątem operatorów przydziału. Zauważ, że =
jest przed &
i że oba symbole są oddzielone. To dlatego, że nie są " połączone operatory ". Semantycznie jest to" przypisanie "" odniesienia"; nie jest to "operator przypisania odniesienia".
Po drugie, spójrz, jak wszystkie" operatory połączone " są napisane niżej na stronie dokumentów. =
jest konsekwentnie symbolem najbardziej prawym. Jest to bardzo ważne rozróżnienie, ponieważ zapis &
po lewej stronie =
zmienia znaczenie-staje się operatorem połączonym ("operatorem bitowym i przypisania") zamiast przypisania do odniesienia.
PSR standardy kodowania powinny być czymś, czego wszyscy programiści PHP są świadomi i starają się przestrzegać. Zwróć uwagę na tę regułę PSR-12 sekcja 6.2:
Wszystkie operatory arytmetyczne, porównawcze, przyporządkowujące, bitowe, logiczne, łańcuchowe i typu muszą być poprzedzone i poprzedzone przynajmniej jedną spacją
Zgodnie z tą zasadą, po operatorze =
zawsze powinna być spacja - to czyni =&
naruszenie.
Ponadto istnieją inne zasady, które stwierdzają, że nie powinno być spacji pomiędzy &
a jej zmienną/argumentem / funkcją / itd.
Podczas używania operatora referencji & przed argumentem, nie może być spacji po nim
TL;DR
Podczas przypisywania referencji, Zawsze zapisuj =
ze spacjami po obu stronach i nigdy nie zapisuj spacji po &
.
- zły:
$a =& $b;
- dobre:
$a = &$b;
Wykazane konsekwentnie / poprawnie: https://riptutorial.com/php/example/11991/assign-by-reference
Nie wykazano konsekwentnie / poprawnie:Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-16 09:32:02