Referințe
Referințele în PHP permit referirea la o zonă de memorie unde este localizată valoarea unei variabile sau a unui parametru.
Pentru a crea o referință, se folosește simbolul ampersand (&) înaintea variabilei. Înainte de a examina referințele, să analizăm un exemplu simplu de copiere a variabilelor:
<?php
$tom = "Tom";
$sam = $tom;
$sam = "Sam";
echo "tom = $tom <br>"; // tom = Tom
echo "sam = $sam"; // sam = Sam
?>
Aici, variabilei $sam i se atribuie valoarea variabilei $tom ("Tom"). Apoi, variabilei $sam i se atribuie o nouă valoare - "Sam". Rezultatul programului este previzibil - ambele variabile au valori diferite:
tom = Tom
sam = Sam
Acum, la copierea valorii variabilelor, vom folosi o referință:
<?php
$tom = "Tom";
$sam = &$tom; // transmiterea referinței
$sam = "Sam";
echo "tom = $tom <br>"; // tom = Sam
echo "sam = $sam"; // sam = Sam
?>
Aici ne interesează expresia:
$sam = &$tom;
În acest caz, variabilei $sam i se atribuie nu copia valorii variabilei $tom, ca în exemplul anterior, ci o referință la zona de memorie ocupată de variabila $tom. După executarea instrucțiunii:
$sam = &$tom;
Ambele variabile vor indica aceeași adresă de memorie. Acest lucru va duce la faptul că schimbarea valorii uneia dintre aceste variabile va schimba și valoarea celeilalte variabile, deoarece ele indică aceeași zonă de memorie și, prin urmare, au aceeași valoare comună:
tom = Sam
sam = Sam
Atribuirea unei referințe la variabilă se poate face în două moduri:
$sam = &$tom;
// sau așa
$sam = & $tom;
Transmiterea prin referință
În exemplul din temele anterioare, am transmis parametrii prin valoare. Dar în PHP există și o altă formă de transmitere a parametrilor - prin referință.
Să examinăm și să comparăm aceste două moduri de transmitere a parametrilor. Transmiterea standard a parametrilor prin valoare:
<?php
function square($a) {
$a *= $a;
echo "a = $a";
}
$number = 5;
square($number);
echo "<br />number = $number";
?>
Rezultatul programului:
a = 25
number = 5
În acest caz, în interiorul funcției square(), valoarea parametrului $a este ridicată la pătrat. Adică valoarea parametrului din interiorul funcției se schimbă.
Cu toate acestea, după apelul funcției square(), valoarea variabilei $number transmisă parametrului $a nu se va schimba. Aceasta este transmiterea prin valoare, care nu afectează variabila $number.
Acum să examinăm transmiterea parametrului prin referință:
<?php
function square(&$a) {
$a *= $a;
echo "a = $a";
}
$number = 5;
square($number);
echo "<br />number = $number";
?>
Rezultatul programului:
a = 25
number = 25
La transmiterea prin referință, se pune simbolul ampersand înaintea parametrului: function square(&$a). Acum, interpretatorul va transmite nu valoarea variabilei, ci referința la această variabilă din memorie.
Astfel, atât variabila $number, cât și parametrul $a vor indica aceeași zonă de memorie. În consecință, valoarea variabilei $number după transmiterea parametrului &$a se va schimba.
Returnarea unei referințe din funcție
O funcție poate returna și o referință. În acest caz, la definirea și apelul funcției, se pune simbolul ampersand înaintea numelui funcției:
<?php
function &checkName(&$name) {
if ($name === "admin") $name = "Tom";
return $name;
}
$userName = "admin";
$checkedName = &checkName($userName);
echo "<br />userName: $userName";
echo "<br />checkedName: $checkedName";
?>
În acest caz, funcția checkName() primește un parametru prin referință și returnează o referință - de fapt, referința transmisă în funcție. Pentru aceasta, înaintea definirii funcției se pune simbolul ampersand:
function &checkName(&$name)
Pentru a imita funcționarea, funcția verifică numele utilizatorului și îl schimbă la un nume standard dacă este egal cu "admin".
La apelul funcției, se pune simbolul ampersand înaintea numelui funcției:
$checkedName = &checkName($userName)
După executarea funcției, variabila $checkedName va conține de fapt referința la variabila $userName.