Gönderimlerle İlgili Herşey
PHP Manual

Gönderim Ne Yapar?

PHP gönderimleri aynı içeriğe iki değişken tarafından atıf yapılmasını mümkün kılar. Yani, şunu yazarsanız:

<?php
$a 
=& $b;
?>

Bunun anlamı, $a ve $b değişkenlerinin aynı içeriği gösterdiğidir.

Bilginize: Burada $a ve $b tamamen eşittir; ne $a, $b'yi göstermekte ne de $b, $a'yı göstermektedir; $a ve $b aynı yeri göstermektedir.

Bilginize: Eğer bir dizi gönderimle kopyalanmışsa gösterilen şey değerler değildir. Bu ayrıca işlevlere değerleriyle aktarılan diziler için de geçerlidir.

Bilginize: Eğer tanımlanmamış bir değişken gönderimle atanır, aktarılır veya döndürülürse oluşturulmuş olur.

Örnek 1 - Gönderimlerin tanımlanmamış değişkenlerle kullanımı

<?php
function foo(&$var) { }

foo($a); // $a "oluşturulur" ve değer olarak null atanır

$b = array();
foo($b['b']);
var_dump(array_key_exists('b'$b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c'd')); // bool(true)
?>


Aynı sözdizimi, gönderim döndüren işlevler ve new işleci (PHP 4.0.4 ve sonrası) ile kullanılabilir:

<?php
$bar 
=& new BirSınıf();
$foo =& dğşkn_bul($bar);
?>

PHP 5'ten beri, new özdevinimli olarak gönderim döndürmekte, bu bakımdan böyle bir bağlamda =& kullanımı önerilmemekte ve kullanıldığında E_STRICT seviyesinde ileti üretmektedir.

Bilginize: & işlecinin kullanılmaması nesnenin bir kopyasının yapılmasına sebep olur. $this sınıf içinde kullanılırsa, sınıfın mevcut örneği üzerinde işlem yapar. & olmaksızın atama, örneği (yani, nesneyi) kopyalayacak ve $this kopyanın üzerinde işlem yapacaktır ki, bu her zaman istenen bir şey değildir. Başarım ve bellek tüketimi bakımından normalde tek bir örnek üzerinde çalışılmak istenir.
@ işlecini @new olarak kullanarak kurucudaki hataları susturmak mümkünse de &new kullanarak bu mümkün olmaz. Bunun sebebi Zend Motorundaki bir sınırlama olup, bu çeşit kullanım bir çözümleme hatasıyla sonuçlanır.

Uyarı

Bir işlevin içinde global olarak bildirilmiş bir değişkeni gönderimli olarak atarsanız gönderim sadece işlevin içinde görünür olur. $GLOBALS dizisini kullanarak bundan kaçınabilirsiniz.

Örnek 2 - İşlev içinde küresel değişkenlere gönderim

<?php
$var1 
"Örnek değişken";
$var2 "";

function 
küresel_gönderimler($küreselleri_kullan)
{
    global 
$var1$var2;
    if (!
$küreselleri_kullan) {
        
$var2 =& $var1// sadece işlev içinde görünürdür
    
} else {
        
$GLOBALS["var2"] =& $var1// küresel alanda da görünürdür
    
}
}

küresel_gönderimler(false);
echo 
"var2'ye '$var2' atanır\n"// var2'ye '' atanır
küresel_gönderimler(true);
echo 
"var2'ye '$var2' atanır\n"// var2'ye 'Örnek değişken' atanır
?>

global $var; deyimi $var =& $GLOBALS['var']; deyimine bir kısayol olarak düşünülür. Bu bakımdan $var'a başka bir gönderim atamak sadece yerel değişkenin gönderimini değiştirir.

Bilginize: Eğer bir değişkene foreach döngüsü içinde gönderimle bir değer atarsanız gönderimde de değişiklik yapılmış olur.

Örnek 3 - foreach döngüsü içinde gönderim

<?php
$ref 
0;
$row =& $ref;
foreach (array(
123) as $row) {
    
// işlemler
}
echo 
$ref// 3 - yinelenen dizinin son elemanı
?>


Gönderimlerle yapılan ikinci şey değişkenleri gönderimle aktarmaktır. Bir işlev içinde bir yerel değişken oluşturup çağrı etki alanında bir değişkenle aynı içeriğe gönderim yaparak bu gerçeklenebilir. Örnek:

<?php
function foo(&$var)
{
    
$var++;
}

$a=5;
foo($a);
echo 
$a// 6 çıktılar
?>

$a'nın 6 olmasının sebebi foo işlevinde $var değişkeninin $a'nın içeriğine gönderimli olmasıdır. Daha ayrıntılı açıklamayı gönderimle aktarım bölümünde bulabilirsiniz.

Gönderimlerle yapılan üçüncü şey gönderimli değer döndürmedir.


Gönderimlerle İlgili Herşey
PHP Manual