PHP kézikönyv
Előző | 21. Fejezet. Referenciák | Következő

# 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.

Előző | Tartalom | Következő
Referenciák | Fel | Mit nem lehet referenciákkal tenni