Czy zmienne PHP są przekazywane przez wartość czy przez referencję?
php
variables
pass-by-reference
pass-by-value
cmcculloh
źródło
źródło
Odpowiedzi:
Jest pod względem wartości, zgodnie z Dokumentacją PHP .
źródło
$str = add_some_extra($str);
gdybym nie używał referencji, prawda? jaka jest zatem prawdziwa wartość dodana tego?$str
w twoim przypadku zostanie przypisana null.W PHP obiekty są domyślnie przekazywane jako kopia referencyjna do nowego obiektu.
Zobacz ten przykład .............
Teraz zobacz to ..............
Teraz zobacz to ..............
mam nadzieję, że to zrozumiesz.
źródło
$y
nie jest potrzebne - nie ma wfunction changeValue
tym nic, co wymagałoby, aby było w środkuclass Y
, więc splata się dwie niezwiązane ze sobą koncepcje. Chciałbym przejśćfunction changeValue
do zakresu zewnętrznego, tuż powyżej$x = new X();
. Usuń wszystkie odniesienia do$y
. Teraz łatwiej zauważyć, że pierwsze dwa przykłady pozostawiają $ x w spokoju, a trzeci zmienia jego zawartość nanew Y()
. Co byłoby łatwiej sprawdzić, czy wyrzuciłtype
z$x
- fakt, że zarównoX
iY
stało się zawierać$abc
pole ma również znaczenia, co zostanie wykazaneWygląda na to, że wielu ludzi jest zdezorientowanych sposobem, w jaki obiekty są przekazywane do funkcji i co przekazuje się przez odniesienie. Zmienne obiektowe są nadal przekazywane przez wartość, tylko wartość przekazywana w PHP5 jest uchwytem referencyjnym. Jako dowód:
Wyjścia:
Aby przekazać przez referencję , możemy zmodyfikować zmienne widoczne dla dzwoniącego. Które wyraźnie powyższy kod nie działa. Musimy zmienić funkcję wymiany na:
Wyjścia:
w celu przekazania przez odniesienie.
źródło
swap
funkcji; innymi słowy, jeśli obiekty zostały „przekazane przez wartość”. Z drugiej strony jest to dokładnie to, czego można oczekiwać, jeśli uchwyt obiektu zostałby przekazany do funkcji, co faktycznie się dzieje. Twój kod nie rozróżnia tych dwóch przypadków.http://www.php.net/manual/en/migration5.oop.php
źródło
Zmienne PHP są przypisywane przez wartość, przekazywane do funkcji przez wartość, a gdy zawierają / reprezentują obiekty są przekazywane przez odwołanie. Możesz wymusić przekazywanie zmiennych przez referencję za pomocą &
Przypisany przez przykład wartości / odniesienia:
wyszedłby
Przekazywane przez przykład wartości / odniesienia:
wyprowadziłby:
Zmienne obiektowe przekazywane przez przykład odniesienia:
Wyprowadziłby:
(ten ostatni przykład może być lepszy prawdopodobnie ...)
źródło
$foo
jest wskaźnikiem do obiektu .$foo
jest przekazywany przez wartość do funkcjichangeFoo()
, ponieważchangeFoo()
nie zadeklarował swojego parametru za pomocą a&
.Możesz przekazać zmienną do funkcji przez odwołanie. Ta funkcja będzie mogła modyfikować oryginalną zmienną.
Możesz zdefiniować przejście przez odniesienie w definicji funkcji:
źródło
Możesz to zrobić w obie strony.
umieść symbol „&” z przodu, a przekazywana zmienna stanie się jednym i tym samym co jej pochodzenie. tzn .: możesz przekazać referencję zamiast robić jej kopię.
więc
źródło
Zmienne zawierające pierwotne typy są przekazywane przez wartość w PHP5. Zmienne zawierające obiekty są przekazywane przez odniesienie. Jest dość interesujący artykuł z Linux Journal z 2006 roku, który wspomina o tej i innych różnicach OO między 4 a 5.
http://www.linuxjournal.com/article/9170
źródło
&
.Obiekty są przekazywane przez odniesienie w PHP 5 i przez wartość w PHP 4. Zmienne są domyślnie przekazywane przez wartość!
Przeczytaj tutaj: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
źródło
&
.&
przed parametrami w definicji - gdyby zostały przekazane przez wartość, obiekt zawarty w zakresie, który wywołał funkcję z tym parametrem nie ma to wpływu.Atrybuty można modyfikować, jeśli nie zostaną przekazane przez odniesienie, więc uważaj.
Wynik:
SwapObjects: b, a SwapValues: a, b
źródło
Dla każdego, kto spotka się z tym w przyszłości, chcę udostępnić ten klejnot z dokumentów PHP, opublikowanych przez anonimowego użytkownika :
Oto przykład, który podają:
Napisałem obszerny, szczegółowy post na blogu na ten temat dla JavaScript , ale uważam, że ma on zastosowanie równie dobrze do PHP, C ++ i każdego innego języka, w którym ludzie wydają się być zdezorientowani w kwestii przekazywania według wartości i przekazywania przez odniesienie.
Oczywiście PHP, podobnie jak C ++, jest językiem, który obsługuje przekazywanie przez referencję. Domyślnie obiekty są przekazywane według wartości. Podczas pracy ze zmiennymi, które przechowują obiekty, pomaga postrzegać te zmienne jako wskaźniki (ponieważ jest to zasadniczo to, co one są, na poziomie zespołu). Jeśli przekażesz wskaźnik według wartości, nadal możesz „śledzić” wskaźnik i modyfikować właściwości wskazywanego obiektu. To, czego nie możesz zrobić, to wskazanie innego obiektu. Tylko jeśli wyraźnie zadeklarujesz parametr jako przekazany przez referencję, będziesz w stanie to zrobić.
źródło
Właściwie obie metody są poprawne, ale zależy to od twoich wymagań. Wartości referencyjne często powodują spowolnienie skryptu. Dlatego lepiej jest przekazywać zmienne według wartości, biorąc pod uwagę czas wykonania. Również przepływ kodu jest bardziej spójny, gdy zmienne są przekazywane według wartości.
źródło
Użyj tego dla funkcji, gdy chcesz po prostu zmienić oryginalną zmienną i przywrócić ją ponownie do tej samej nazwy zmiennej z przypisaną nową wartością.
źródło
Zależy od wersji, 4 to wartość, 5 to wartość referencyjna.
źródło