“Bazı şeylerin gitmesine izin vermek işte bu nedenle çok önemlidir. Onları serbest bırakmak. Gevşek olanı kesmek. İnsanların hiç kimsenin işaretli kağıtlarla oynamadığını anlaması gerekiyor; bazen kazanırız ve bazen kaybederiz. Hiçbir şeyi ger almayı bekleme, yaptıkların için takdir edilmeyi bekleme, ne kadar zeki olduğunun keşfedilmesini bekleme ya da aşkının anlaşılmasını. Daireyi tamamla. Gururlu, yetersiz ya da kibirli olduğun için değil, sadece artık onun senin yaşamında yeri olmadığı için. Kapıyı kapat, plağı değiştir, evi temizle, tozdan kurtul. Geçmişte olduğun kişi olmayı bırak ve şu an kimsen o ol.”
by Paulo Coelho - Zahir S. 204

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.