Looking for php Keywords? Try Ask4Keywords

PHP Przekaż przez odniesienie


Przykład

Umożliwia to przekazanie zmiennej przez odwołanie do funkcji lub elementu, który pozwala zmodyfikować oryginalną zmienną.

Przekazywanie przez odniesienie nie ogranicza się tylko do zmiennych, można również przekazać następujące odniesienia:

  • Nowe instrukcje, np. foo(new SomeClass)
  • Referencje zwrócone z funkcji

Tablice

Powszechnym zastosowaniem „przekazywania przez referencję” jest modyfikowanie wartości początkowych w tablicy bez wchodzenia w zakres tworzenia nowych tablic lub zaśmiecania przestrzeni nazw. Przekazywanie przez referencję jest tak proste, jak poprzedzanie / poprzedzanie zmiennej &$myElement & => &$myElement .

Poniżej znajduje się przykład wykorzystania elementu z tablicy i dodania 1 do jego wartości początkowej.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

Teraz, gdy użyjesz dowolnego elementu w obrębie $arr , oryginalny element zostanie zaktualizowany wraz ze wzrostem referencji. Możesz to zweryfikować poprzez:

print_r($arr);

Uwaga

Należy wziąć pod uwagę podczas wykorzystywania przejść przez odniesienie w pętli. Na końcu powyższej pętli $num nadal zawiera odwołanie do ostatniego elementu tablicy. Przypisanie go do pętli końcowej spowoduje manipulowanie ostatnim elementem tablicy! Możesz się upewnić, że tak się nie stanie, unset() wyłączając go po zakończeniu pętli:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Powyższe zapewni, że nie napotkasz żadnych problemów. Przykład problemów, które mogą się z tym wiązać, znajduje się w tym pytaniu na StackOverflow .


Funkcje

Innym powszechnym zastosowaniem przekazywania przez odniesienie jest funkcja. Modyfikacja oryginalnej zmiennej jest tak prosta jak:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Które można zweryfikować, echo oryginalną zmienną.

echo $var;

Istnieją różne ograniczenia dotyczące funkcji, jak zauważono poniżej w dokumentacji PHP:

Uwaga: W wywołaniu funkcji nie ma znaku odniesienia - tylko w definicjach funkcji. Same definicje funkcji są wystarczające, aby poprawnie przekazać argument przez odwołanie. Począwszy od PHP 5.3.0, pojawi się ostrzeżenie, że „czas przejścia przez referencję” jest przestarzały, gdy używasz & in foo (& $ a) ;. Począwszy od wersji PHP 5.4.0, czas przejścia przez odwołanie został usunięty, więc użycie go spowoduje błąd krytyczny.