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;
?>

Az $a és $b nevek ugyanarra az értékre hivatkoznak.

Megjegyzés: 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.

Megjegyzés: 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);
?>

Megjegyzés: 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.

Figyelem

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.

Példa 21-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ó'
?>
Gondolj a global $var;-ra úgy, mint a $var =& $GLOBALS['var']; egy rövídítése. Ezért egy másik referencia hozzárendelése a $var-hoz csak a helyi változó referenciáját változtatja meg.

Megjegyzés: Ha egy referenciákkal rendelkező változót adsz meg a foreach utasításban, a referenciák is fognak módosulni.

Példa 21-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
?>

Figyelem

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.

Példa 21-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);
?>

Ez a kód az $a változó értékét 6-ra állítja. Ez azért történik meg, mivel az ize függvényben a $valtozo egy referencia a $a változó értékére. A részletes leírást a referenciakénti paraméterátadás c. fejezetben olvashatod.

A referenciák harmadik felhasználási módja a refencia visszatérési-érték.