Mit lehet referenciákkal tenni
A PHP referenciák lehetőséget adnak arra, hogy egy értékhez két nevet lehessen rendelni. Ez azt jelenti, hogy a következő programban:
<?php
$a =& $b;
?>
Note: Az $a és a $b nevek teljesen egyenrangúak. Nem arról van szó, hogy az $a a $b-re mutat, vagy fordÃtva, hanem arról, hogy az $a és a $b név ugyanannak az értéknek két elnevezése.
Note: Ha egy referenciákat tartalmazó tömböt másolunk, a referenciák másolódnak, nem az értékek. Ugyanez igaz az érték szerinti paraméterátadásnál is.
Ugyanez a forma használható az olyan függvényeknél, amelyek referenciát adnak vissza, vagy a new operátor használatakor (a PHP 4.0.4 és későbbi verziókban):
<?php
$obj =& new valamilyen_osztaly();
$ize =& valtozo_kereses($valami);
?>
Note: Ha nem használod az & -t, akkor az osztálypéldány másoláta adódik át. A $this objektumon belüli használatával ugyanazon az objektumpéldányon dolgozol. Ha az értékadás során az & -t elhagyod, akkor az objektumról másolat készül és a $this már ezen a másolaton fog dolgozni. Van, amikor ez nem kÃvánatos, mivel általában egy példányon szeretnénk dolgozni a jobb memóriahasználat és teljesÃtmény érdekében.
Az @ operátort nem lehet együtt használni a &new utasÃtással, amivel el lehetne nyomni a konstruktorban fellépÅ‘ hibákról történÅ‘ jelzéseket. Ez a jelenlegi Zend motor egyik korlátja, és ezért fordÃtási hibát (parse error-t) fog jelezni, ha ilyet talál.
Ha egy függvényen belül egy global jelzővel ellátott változóhoz referenciát rendelsz hozzá, az a referencia csak a függvény belsejében lesz látható. Ennek elkerülésére használd a $GLOBALS tömböt.
Example#1 Globális változók hivatkozása függvény belsejében
<?php
$var1 = "Példa változó";
$var2 = "";
function globalis_referenciak($globals_hasznalata)
{
global $var1, $var2;
if (!$globals_hasznalata) {
$var2 =& $var1; // csak a függvény belsejében látható
} else {
$GLOBALS["var2"] =& $var1; // globális hatáskörben látható
}
}
globalis_referenciak(false);
echo "var2 értéke '$var2'\n"; // var2 értéke ''
globalis_referenciak(true);
echo "var2 értéke '$var2'\n"; // var2 értéke 'Példa változó'
?>
Note: Ha egy referenciákkal rendelkezÅ‘ változót adsz meg a foreach utasÃtásban, a referenciák is fognak módosulni.
Example#2 Referenciák és a foreach
<?php
$ref = 0;
$sor =& $ref;
foreach (array(1, 2, 3) as $sor) {
// csinal valamit
}
echo $ref; // 3 - a bejárt tömb utolsó eleme
?>
Az összetettebb tömbök inkább átmásolódnak mint hogy referenciák készüljenek róluk. Ennek következtében a következő példa nem úgy fog működni ahogy azt elárnánk.
Example#3 Referenciák összetett tömbökre
<?php
$top = array(
'A' => array(),
'B' => array(
'B_b' => array(),
),
);
$top['A']['parent'] = &$top;
$top['B']['parent'] = &$top;
$top['B']['B_b']['data'] = 'test';
print_r($top['A']['parent']['B']['B_b']); // array()
?>
A a referenciákat paraméterátadáskor is lehet használni. Ebben az esetben a meghÃvott függvény egy lokális változója és a hÃvó környezet egy változója ugyanazt az értéket fogja képviselni. Például:
<?php
function ize(&$valtozo)
{
$valtozo++;
}
$a = 5;
ize($a);
?>
A referenciák harmadik felhasználási módja a refencia visszatérési-érték.