Forum und email

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.

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.

Warning

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ó'
?>
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.

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(
123) as $sor) {
    
// csinal valamit
}
echo 
$ref// 3 - a bejárt tömb utolsó eleme
?>

Warning

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