2009-10-29

PHP - referencje

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:

Top 5 List