Aslında son email durumu özetliyor ama ben de biraz durumu açıklamaya
çalışayım.
__set ve __get   metodları  php için yarattığımız tüm objelerde bulunan
magic metodlardır. Bunların haricinde bir kaç magic metod daha var. __set
metodu  bir objenin olmayan bir attribute'üne bir şey atamak istediğinizde
otomatik olarak çağırılır, __get metodu ise olmayan bir attribute'ü
çağırdığınızda çağırılır.

Örnek vermek gerekirse:
---------------------------------------------
class Deneme{

     public $x = 5;


}


$deneme_objesi = new Deneme();

echo $deneme_objesi->x;
echo $deneme_objesi->a;
$deneme_objesi->b = 3;

----------------------------------------------------
Yukarıdaki kodda Deneme class'ının bir objesini yaratıyoruz ve objenin x
attribute'ünü çağırdığımızda bize normal bir şekilde x'i  veriyor.
Fakat objenin a attribute'ünü çağıırdığımızda php arka planda bizim için
objeye a attribute'ünü ekliyor, ve bunu __get methodu ile yapıyor. Tahmin
edeceğiniz gibi a yeni yaratıldığı için değeri 0, ya da boş string.  Ondan
sonraki satırda da objenin b attribute'ü olmamasına rağmen b'ye  3'ü atamak
istediğimizde, arka planda __set methoduu çalışıyor ve bizim için b'i
yaratıyor.

Umarım yardımcı olmuştur.



27 Ağustos 2009 10:03 tarihinde Ömer F. USTA <[email protected]> yazdı:

> Olayı Elvin'le analiz ettik aslında __set veya __get normal diğer methodlar
> gibi
> override olmuyor daha çok override ettiğimiz olay exception durumları.
>
> yani a->olmayanDegisken=5;
> durumunda override ettiğiniz __set çalışıyor çünkü a sınıfında
> olmayanDegisken
> isminde bir öğe mevcut değil
>
> aynı şekilde
>
> $durum = a->olmayanDegisken;
> durumunda da override ettiğimiz __get çalışıyor.
>
> yaniaslında bu method isimlerinin __get veya __set yerine
> __get_notFound __set_notFound olması daha mantıklı olurmuş.
>
> Hepinize Kolay Gelsin
>
> 2009/8/27 Elvin Şiriyev <[email protected]>:
> > Aslında olay şöyle (bende yeni farkına vardım):
> >
> > __set() is run when writing data to inaccessible members.// tanımlanmamış
> > (erişilemeyen) değişkenler yazılırken çalışır
> >
> > __get() is utilized for reading data from inaccessible members. .//
> > tanımlanmamış (erişilemeyen) değişkenler yazılırken çalışır
> >
> > daha önce gönderdiğim örnekte set'in çalışıp get in çalışmamasının nedeni
> de
> > get'in set de değişken tanımlandıktan sonra "erişilemeyen"
> tanımlamasından
> > çıktığı içindir.
> >
> > Kaynak: http://www.php.net/manual/en/language.oop5.overloading.php
> >
> > 2009/8/27 Elvin Şiriyev <[email protected]>
> >>
> >> <?php
> >> class Araba {
> >>     public function __set($degisken, $deger){
> >>         $this->$degisken = $deger;
> >>     }
> >>     public function __get($degisken){
> >>         return $this->$degisken;
> >>     }
> >> }
> >>
> >> $a = new Araba();
> >> $a->sorun = '$this->degisken değil gerçekten $this->$degisken';
> >> echo $a->sorun;
> >>
> >>
> >> 2009/8/27 Ömer F. USTA <[email protected]>
> >>>
> >>> malesef işe yaramadı.
> >>> sanki __set ve __get hiç override olmuyor gibi
> >>>
> >>> 2009/8/27 Mecid UYSAL <[email protected]>:
> >>> > Kusura bakma esittire 2 defa basmisim ;)))
> >>> >
> >>> >
> >>> >        public function __set($degisken, $ degeri) {
> >>> >                $this->$degisken = $degeri;
> >>> >        }
> >>> >
> >>> >        public function __get($degisken) {
> >>> >                return $this->$degisken;
> >>> >        }
> >>> > Seklinde deneyiniz.
> >>> >
> >>> >
> >>> > Bu sekilde deneyiniz. PHP de classlarda degiskenlere erisirken
> >>> > "$this->degisken" seklinde erisirsiniz.
> >>> >        Class disindanda;
> >>> >                $obje = new Class;
> >>> >                $obje->degisken;
> >>> > Seklinde erisirsiniz.
> >>> >
> >>> >
> >>> > -----Original Message-----
> >>> > From: [email protected]
> >>> > [mailto:[email protected]] On Behalf Of
> Ömer
> >>> > F.
> >>> > USTA
> >>> > Sent: Thursday, August 27, 2009 8:49 AM
> >>> > To: Özgür yazılımlarla çeşitli dillerde yazılım geliştirme
> >>> > Subject: [Linux-programlama] Re: [php (5.3.0)] Override problemim (
> >>> > __get /
> >>> > __set )
> >>> >
> >>> > merhaba
> >>> > bunun mantığını anlayamadım ben karşılaştırma yapmıyorum ki ?
> >>> > Ayrıca $this->$degisken  değilde o $this->degisken olması gerekiyordu
> >>> > galiba.
> >>> > ben kod içerisinde nesnemdeki bir public değişkenin değeri değişince
> >>> > öncelikle değişti yazısını yazdırıp sonra normal atama işlemini
> yapmak
> >>> > istiyorum
> >>> > yani == ile eşitlik kontrolünü neden yaptınız ?
> >>> >
> >>> > 2009/8/27 Mecid UYSAL <[email protected]>:
> >>> >>        function __set($degisken,$degeri){
> >>> >>                echo("<br>Verin olan ".$degisken." e ".$degeri."
> >>> >> verisini
> >>> >> yerleştirdim<br>");
> >>> >>                //$degisken=$degeri;
> >>> >>
> >>> >>                // Yukardaki satiri bu sekilde degistirirsen hatan
> >>> >> duzelecektir..
> >>> >>                $this->$degisken = =$degeri;
> >>> >>        }
> >>> >>
> >>> >> Kolay gelsin...
> >>> >>
> >>> >>
> >>> >>
> >>> >>
> >>> >> -----Original Message-----
> >>> >> From: [email protected]
> >>> >> [mailto:[email protected]] On Behalf Of
> >>> >> Ömer F.
> >>> >> USTA
> >>> >> Sent: Thursday, August 27, 2009 5:32 AM
> >>> >> To: Özgür yazılımlarla çeşitli dillerde yazılım geliştirme
> >>> >> Subject: [Linux-programlama] [php (5.3.0)] Override problemim (
> __get
> >>> >> /
> >>> >> __set )
> >>> >>
> >>> >> Merhabalar
> >>> >> php tarafındaki oop eksikliklerimi gidermek için örnekler yazarak
> >>> >> eksiğimi gidermeye çalışırken şöyle bir sorunla karşılaştım:
> >>> >>
> >>> >> __get ve __set fonksiyonlarını Override etmeme rağmen php bunu
> >>> >> yoksayıyor.
> >>> >> Acaba nerede hata yapıyorum :
> >>> >>
> >>> >> Araba.php dosya içeriği :
> >>> >>
> >>> >> <?php
> >>> >>
> >>> >> class Araba {
> >>> >>        protected $calisiyorMu = false;
> >>> >>        protected $marka = "";
> >>> >>        public $deger1 = 100;
> >>> >>
> >>> >>        function __construct($MarkaAdi) {
> >>> >>                $this->calisiyorMu = true;
> >>> >>                $this->marka=$MarkaAdi;
> >>> >>        }
> >>> >>
> >>> >>        function calistir() {
> >>> >>                $this->calisiyorMu=true;
> >>> >>        }
> >>> >>
> >>> >>        function durdur() {
> >>> >>                $this->calisiyorMu=false;
> >>> >>        }
> >>> >>
> >>> >>        function __toString(){
> >>> >>                return "Bu Araba : ". $this->marka ." Markadir.";
> >>> >>        }
> >>> >>
> >>> >>        function __get($degisken){
> >>> >>                echo("<br>Talepte Bulunduğun verinin değeri:
> >>> >> ".$degisken."<br>\n");
> >>> >>                return $degisken;
> >>> >>        }
> >>> >>
> >>> >>        function __set($degisken,$degeri){
> >>> >>                echo("<br>Verin olan ".$degisken." e ".$degeri."
> >>> >> verisini
> >>> >> yerleştirdim<br>");
> >>> >>                $degisken=$degeri;
> >>> >>        }
> >>> >>
> >>> >>        function durum() {
> >>> >>                return $this->calisiyorMu;
> >>> >>        }
> >>> >>
> >>> >>        function __destruct()
> >>> >>        {
> >>> >>                echo "gitttiiiiii gittti gül gibi $this gitti.";
> >>> >>        }
> >>> >>
> >>> >> }
> >>> >>
> >>> >>
> >>> >>
> **************************************************************************
> >>> >> index.php dosya içeriği :
> >>> >>
> >>> >> <?php
> >>> >> function __autoload($class_name) {
> >>> >>    require_once $class_name . '.php';
> >>> >> }
> >>> >>
> >>> >> echo("yeni arabam :\n<br>");
> >>> >> $arabam = new Araba("Serçe");
> >>> >> echo ($arabam." <br>");
> >>> >>
> >>> >> echo ("<br> *****************<br>");
> >>> >> echo ("Çalışıyor mu : <br>");
> >>> >> echo ($arabam->durum() ? "Çalışıyor : )":"Durmuş :(" );
> >>> >>
> >>> >> echo ("<br> *****************<br>");
> >>> >> $arabam->durdur();
> >>> >> echo ("Çalışıyor mu : <br>");
> >>> >> echo ($arabam->durum() ? "Çalışıyor : )":"Durmuş :(" );
> >>> >>
> >>> >> echo ("<br> *****************<br>");
> >>> >> $arabam->calistir();
> >>> >> echo ("Çalışıyor mu : <br>");
> >>> >> echo ($arabam->durum() ? "Çalışıyor : )":"Durmuş :(" );
> >>> >>
> >>> >> echo ("<br> *****************<br>");
> >>> >> echo ("get/set overload testim:<br>");
> >>> >> echo ($arabam->deger1);
> >>> >> $deneme = $arabam->deger1;
> >>> >> $arabam->deger1=500;
> >>> >>
> >>> >> echo ("<br> *****************<br>");
> >>> >> $arabam =0;
> >>> >> echo ("<br> *****************<br>");
> >>> >>
> >>> >> ?>
> >>> >>
> >>> >>
> >>> >>
> >>> >
> >>> >
> ****************************************************************************
> >>> >> *****
> >>> >>
> >>> >> Çıktı :
> >>> >>
> >>> >> yeni arabam :
> >>> >> Bu Araba : Serçe Markadir.
> >>> >>
> >>> >> *****************
> >>> >> Çalışıyor mu :
> >>> >> Çalışıyor : )
> >>> >> *****************
> >>> >> Çalışıyor mu :
> >>> >> Durmuş :(
> >>> >> *****************
> >>> >> Çalışıyor mu :
> >>> >> Çalışıyor : )
> >>> >> *****************
> >>> >> get/set override testim:
> >>> >> 100
> >>> >> *****************
> >>> >> gitttiiiiii gittti gül gibi Bu Araba : Serçe Markadir. gitti.
> >>> >> *****************
> >>> >>
> >>> >>
> >>> >> burada ki çıktıda get / set override testim kısmında Eksiklikler
> >>> >> mevcut
> >>> >> beklentim şu şekilde çıktı vermesi yönündeydi :
> >>> >>
> >>> >> Talepte Bulunduğun verinin değeri: 100
> >>> >> 100
> >>> >> Talepte Bulunduğun verinin değeri: 100
> >>> >> Verin olan 100 e 500 verisini yerleştirdim
> >>> >>
> >>> >> fakat bir yerde ben veya php hata yapıyoruz.
> >>> >> Şimdiden teşekkürler
> >>> >>
> >>> >> Saygılarılma
> >>> >> ömer
> >>> >>
> >>> >>
> >>> >> --
> >>> >> Ömer Fadıl USTA
> >>> >> http://www.bilisimlab.com/
> >>> >> _______________________________________________
> >>> >> Linux-programlama mailing list
> >>> >> [email protected]
> >>> >> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >>> >>
> >>> >> _______________________________________________
> >>> >> Linux-programlama mailing list
> >>> >> [email protected]
> >>> >> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >>> >>
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> > Ömer Fadıl USTA
> >>> > http://www.bilisimlab.com/
> >>> > _______________________________________________
> >>> > Linux-programlama mailing list
> >>> > [email protected]
> >>> > http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >>> >
> >>> > _______________________________________________
> >>> > Linux-programlama mailing list
> >>> > [email protected]
> >>> > http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >>> >
> >>>
> >>>
> >>>
> >>> --
> >>> Ömer Fadıl USTA
> >>> http://www.bilisimlab.com/
> >>> _______________________________________________
> >>> Linux-programlama mailing list
> >>> [email protected]
> >>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >>
> >>
> >>
> >> --
> >> Elvin Şiriyev
> >> http://siriyev.net
> >
> >
> >
> > --
> > Elvin Şiriyev
> > http://siriyev.net
> >
> > _______________________________________________
> > Linux-programlama mailing list
> > [email protected]
> > http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> >
> >
>
>
>
> --
> Ömer Fadıl USTA
> http://www.bilisimlab.com/
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>



-- 
Anıl Özselgin
_______________________________________________
Linux-programlama mailing list
[email protected]
http://liste.linux.org.tr/mailman/listinfo/linux-programlama

Cevap