Reference assignment operator in PHP, =&

Co robi operator przypisania =& (equals-ampersand) w PHP?

Czy jest przestarzały?
Author: Peter Mortensen, 2009-11-20

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.

 133
Author: user56reinstatemonica8,
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ść.

 27
Author: Asaph,
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.

 8
Author: malcanso,
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:
 0
Author: mickmackusa,
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