Değişken Atamaları Üzerine
$a = $b;
PHP'de değişkenler birbirlerine atanırken 2 şekilde atanır;
1- Değişkeni kopyalayıp atanan değişkene yazmak. (Pass by Value)
2- Değişkenin sadece referansını kopyalamak. (Pass by Reference)
Bu çoğu OOP destekleyen dilde bu şekildedir.
1- Değişkenin değerini atamak.
İlkel (primitive) dediğimiz değişken türlerinde(integer, string gibi...), atamalar yapılırken bu şekilde yapılır.
$a = 4; $b = $a; echo $b //ekrana 4 yazar $b = 5; echo $a //ekrana yine 4 yazar.
Bunu zaten biliyoruz.
2- Değişkenin referansını atamak.
String gibi ilkel tipler dışında kalan; nesneler, veritabanı pointerleri gibi değişkenlerin referansları atanır.
Örneğin MyClass adında bir classımız olsun;
$o1 = new MyClass(); $o1->prop1 = "hey hey ben o1 nesnesiyim!..."; $o2 = $o1;// bu kod çalıştığında o2 değişkeninde yeni bir MyClass nesnesi değil, eski o1 değişkenindeki nesnenin referansı atanacaktır $o2->prop1 = "ben o2 nesnesiyim"; echo $o1->prop1; //ekrana "ben o2 nesnesiyim" yazar.
Peki bu neden böyledir ?
Bundan önceki 2 yazımda da bahsettiğim "nesnenin referansını döndüren fonksiyon" ve "singleton class" ları da ancak
bu şekilde yazabiliriz. Genelde nesneyi başka değişkene atadığımızda aynı nesneye ulaşmak isteyebiliriz.
Yeni bir nesne istediğimizde ise karşımıza iki yol çıkıyor;
$o2 = new MyClass(); // nesneyi yeniden türetmek //yada $o2 = clone $o1; // nesneyi koplayamak
Tabii nesneyi clonladığımızda class içerisine yazacağımız __clone methodunu çalıştırabileceğimizi unutmayalım.
class MyClass{ public function __clone(){ echo "nesneyi clonladın yakaladım"; } }
__clone fonksiyonunu public değil private ve içi boş olarak tanımlarsak, nesneyi kimse clonlayamaz.