Wszyscy wiemy do czego służą - "W PHP referencje są środkiem dostępu do tej samej wartości zmiennej poprzez różne nazwy. Nie działają na takiej zasadzie jak wskaźniki w C, lecz są aliasami w tablicy symboli. Zwróć uwagę na to, że w PHP nazwa zmiennej oraz wartość zmiennej są dwiema różnymi rzeczami, wobec tego ta sama wartość może być dostępna poprzez różne nazwy. Najbliższą analogią jest Uniksowy system plików i ich nazw - nazwy zmiennych to wpisy katalogowe, a wartości to same pliki. Można myśleć o referencjach jak o twardych dowiązaniach w Uniksowym systemie plików. " - (http://php.net/)
Podstawy
$a = 1;
$b =& $a;
$a = 2;
var_dump($a); // wynik 2
var_dump($b); // wynik 2
Przekazywanie referencji do metody
Przykład:
$tab = array( 'strasznie duza tablica', 'i jeszcze wiecej tablic' );
function Test( & $pTablica )
{
//jakieś operacje na tablicy
null;
}
Test($tab);
W ten sposób każde wywołanie metody z parametrem będzie przekazywane przez referencje
Trzeba jednak zawsze pamiętać że referencje są do zmiennych!! czyli:
Test( null );
Test( array('cos', 'tez') );
Test( trim($zmienna) );
Test( true );
wszędzie pojawi się błąd - "Only variables can be passed by reference", czyli musimy zrobić $cos = null i przekazać etc.
Dlatego można sobie ze strony przekazania do funkcji zmiennej przez referencje
function Test1( $pTablica )
{
//jakieś operacje na tablicy
null;
}
Test1( & $tab );
Można to stosować kiedy nie zawsze chcemy żeby metoda przechodziła przez referencje.
Tutaj zademonstruje przykład kiedy metoda zmienia zewnętrzną zmienną dlatego że jest jej referencją
function Test2( & $pZmienna )
{
$pZmienna = 'Zmieniona tablica';
}
$zmienna = 'Zmienna';
Test2($zmienna);
var_dump($zmienna); // wynik 'Zmieniona tablica'
Czyli jak widać nie trzeba nic zwracać bo zmiany lecą "na żywca"
Zwracanie referencji przez metodę
Jeżeli chcemy by dana metoda zwracała nam zawsze referencje, dodajemy & przed nazwa metody.
function & Test3( $pTablica )
{
//jakieś operacje
$a = 'test3';
return $a;
}
Pamiętamy że zwrot metody przez referencje musi się odnosić do zmiennej czyli nie możemy dać samego return 'test2'; czy np return true;
Jeżeli chcemy żeby jakaś metoda nam zwracała wartość przez referencje to możemy dać
function Test4( $pTablica )
{
//jakieś operacje
$a = 'test4';
return $a;
}
$test3 =& Test4( array('cos') );
Korzyści
Jeżeli mamy dużą tablicę i chcemy przekazać ją do metody, normalnie zostanie skopiowana co równa się więcej pamięci i czasu.
Po zmianie w metodzie danych w tablicy zmienna na zewnątrz metody też będzie miała zmiany.
Uwagi - o czym należy pamiętać
Od php5 obiekty są automatycznie przez referencje przekazywane do metod w php4 trzeba to robić ręcznie.
Stosujemy kiedy jesteśmy naprawdę pewni że żadna inna część kodu nie będzie używać tego bez referencji i zmiany które metoda zrobi chcą takimi jakimi chcemy.
Brak komentarzy:
Prześlij komentarz