“Pratik, iyi bir noktaya geldikten sonra yaptığımız bir şey değildir. Sizi iyi bir noktaya getirmesi için yaptığımız bir şeydir.”
by Malcolm Gladwell Outliers S. 36

Php de Passing By Reference ve Returning References

Tarih: Ocak 18th, 2010 | Yazar: | Kategoriler: Php | Etiketler: , , | 1 Yorum »

Bugün size karışık gibi görünen fakat oldukça basit bir konuyu yani passing by reference (gönderimle aktarım) ve returning references (gönderimle döndürme) anlatmaya çalışacağım. Öncelikle references ne olduğuna bakalım.

<?php
$a = 1;
$b = 2;
$a =& $b;
echo $a; //Ekrana 2 yazar
$a = 10;
echo $b; //Ekrana 10 yazar
$b = 20;
echo $a; //Ekrana 20 yazar
unset($a);
echo $b; //Ekrana 20 yazar
?>

Yukarıdaki kodu incelediğinizde fark edeceksiniz ki $a ve $b değişkenleri sanki birbirlerinin aynısı gibi davranıyorlar. Yani $a artarsa $b de aynı oranda artıyor veya $b azalırsa $a da aynı oranda azalıyor ve aynı değere sahip oluyor iki değişkende. Eğer daha önce references kullanmadıysanız fark edeceksiniz ki $a değişkenin $b değişkenine eşitlerken ve(&) karakterini kullanmışız. Ve karakteri ile $a değişkeninin $b değişkenin aynısı olmasını sağladık yani bellekte aynı bölgeyi iki farklı değişken ile işgal etmiş oluyoruz. Ama unset ile $a değişkenini yok ettiğimizde $b değişkenine birşey olmayacaktır. References değişkenlerde kullanımı bu şekilde. Şimdi fonksiyonlardaki argüman atamalarında yani passing references da durum nasıl onu inceleyelim.

<?php
function foo(&$b)
{
    $b++;
}
$a = 1;
foo($a);
echo $a; //Ekrana 2 basar.
?>

Yukarıdaki argüman atamasında ise $b’nin önüne ve(&)  karakteri konuluyor bu sayede $b değişkenin ile $a değişkeni tamamen eşitleniyor. Yani  yukarıda yaptığımız passing by variable işlemini bir benzeri yapılış biçimi farklı olsa da yaptıkları iş birbirinin aynısı $b değişkeni artarsa $a değişkeni de aynı oranda artacaktır. Ve son olarak returning by references inceleyelim.

class foo {
    public $deger = 99;

    public function &getDeger() {
        return $this->deger;
    }
}

$obj = new foo;
$a = &$obj->getDeger();//$a değişkenine returning references uyguladık.
$obj->deger = 100;
echo $a;//Ekrana 100 basar

Burada ise $a değişkenini getDeger fonksiyonundan dönen değer ile eşitliyoruz yani aynısı yapıyoruz. Bu sayede nesne içinden veya dışından $deger değişkeninde herhangi bir değişiklik yaptığımızda aynı değer $a değişkenimizede yansıyacaktır.  Bu sayede $deger değişkeninde ne olduğunu öğrenmek için nesne üzerinden çağırma yapmamıza gerek kalmıyor $deger değişkenindeki tüm veriyi $a değişkeni üzerinden kolayca görebilmekteyiz.