Kiedy pass-by-reference w PHP

Zastanawiam się, czy jego dobrą praktyką jest przechodzenie przez odniesienie, gdy czytasz tylko zmienną, lub Czy zawsze powinna być przekazywana jako wartość.

Przykład z pass-by-reference:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function &do_my_hash(&$value){
   return md5($value);
}

Przykład z wartością pass-by-value:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function do_my_hash($value){
   return md5($value);
}
Która jest lepsza ? Np. gdybym miał uruchomić pętlę z 1000 nabojami ?

Przykład pętli:

for($i = 0 ; $i < 1000 ; $i++){
   $a = 'Fish & Chips '.$i;
   echo do_my_hash($a);
}
Author: Vidar Vestnes, 2010-01-28

5 answers

Jeśli chcesz przekazać wartość (więc funkcja tego nie modyfikuje) , nie ma powodu, aby przekazać ją przez odniesienie : tylko utrudni to zrozumienie twojego kodu, ponieważ ludzie pomyślą "Ta funkcja mogłaby zmodyfikować to, co ja mu przekażę - Och, nie modyfikuje tego?"

W podanym przykładzie twoja do_my_hash funkcja nie modyfikuje wartości, którą do niej przekazujesz; więc nie użyłbym referencji.

I jeśli martwisz się o wydajność, powinieneś przeczytać ten ostatni post na blogu: nie używaj referencji PHP :

Innym powodem, dla którego ludzie używają referencji, jest ponieważ oni myślą, że to sprawia, że kod szybciej. Ale to jest złe. Jest nawet gorzej: odsyłacze najczęściej tworzą kod wolniej! Tak, referencje często sprawiają kod wolniejszy-Przepraszam, musiałem powtórz to, żeby było jasne.

Właściwie ten artykuł może być interesującą lekturą, nawet jeśli nie martwisz się przede wszystkim o wykonanie; -)

 45
Author: Pascal MARTIN,
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
2014-05-15 21:58:49

PHP korzysta z copy-on-write w jak największym stopniu (zawsze, gdy zazwyczaj zwiększa wydajność), więc używanie referencji nie przyniesie żadnych korzyści wydajnościowych; tylko zaszkodzi. Używaj referencji tylko wtedy, gdy naprawdę ich potrzebujesz. Z podręcznika PHP:

Do not użyj return-by-reference, aby zwiększyć wydajność. Silnik automatycznie zoptymalizuje to na własną rękę. Zwróć referencje tylko wtedy, gdy masz ważny techniczny powód, aby to zrobić.

 12
Author: Matthew,
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
2010-01-28 21:06:38

Dobrą praktyką programistyczną jest zawsze przekazywanie wartości, kiedy tylko jest to możliwe, i jeśli musisz zmodyfikować pojedynczą wartość, ogólnie lepiej jest zwracać zmodyfikowaną wartość jako wynik funkcji, zamiast przekazywać ją przez odniesienie.

Jedynymi przypadkami, w których może być konieczne przejście przez odniesienie, są przypadki, w których trzeba zmodyfikować wiele wartości. Jednak te przypadki wydają się być rzadkie i zwykle powinny być traktowane jako flaga, aby sprawdzić kod, ponieważ prawdopodobnie istnieje lepszy sposób zbliżania się problem.

W dawnych czasach wczesne języki programowania zawsze były używane do przekazywania przez odniesienie, a przekazywanie przez wartość było późniejszym rozwojem w celu rozwiązania problemów, które to spowodowało (masz tendencję do kończenia z niejasnymi błędami, ponieważ prędzej czy później jakiś programista wprowadza kod, aby zmodyfikować przekazaną przez odniesienie wartość w jakiejś funkcji lub innej, a następnie trudno jest zidentyfikować, gdzie i naprawić poprawnie - masz tendencję do kończenia z wieloma, niejasnymi zależnościami). W związku z tym jest to dość Perwersyjne naprawdę poważnie rozważyć to jako opcję do golenia kilku cykli maszyn, gdy jesteśmy wiele generacji procesora poza punktem, kiedy uznano to za dobry kompromis cpu vs złożoności, aby pomóc czysty, konserwowalny, kod.

 8
Author: Cruachan,
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
2010-01-28 21:01:38

Radość mikro-optymalizacji. :-)

Szczerze mówiąc, prawdopodobnie nie ma wiele do zyskania, przekazując' normalne ' zmienne przez odniesienie(chyba że chcesz wpłynąć na ich wartość w ich pierwotnym zakresie). Ponadto, ponieważ PHP 5 obiektów są automatycznie przekazywane przez odniesienie.

 3
Author: John Parker,
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
2010-01-28 20:51:18

Przejście przez referencję nie daje żadnej korzyści, jeśli nie chcesz modyfikować tej wartości wewnątrz funkcji. Staram się używać pass-by-value jak najwięcej, ponieważ jest o wiele łatwiejsze do odczytania, a przepływ skryptu jest bardziej spójny.

 2
Author: Mike Trpcic,
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
2010-01-28 20:46:17