Php ‘de neden set ve get fonksiyonları kullanırız/kullanmayız?

Her yazdığım yeni projede beraber çalıştığım arkadaşlarıma ve kendime şart koştuğum bir husus var.

Bir önceki projenizde yazdığınız kod, bir sonraki projenizin aynısı olamaz.

Bu işletmesel olarak sorun ( Kişisel gelişim = Para ) ama Metromedya elinden çıkan her projede daha iyi ve daha doğru çalışan kodlara yaklaşmak demekti.

Geçenlerde diğer dillerden (java,c++,c#) alışık olduğumuz kapsülleme (encapsulation) yapısının kullanılması gerektiğini savunurken neden php ile ilgili kendi sitesi dahil bu konunun vurgulanmadığını merak ettim.

Ufak bir araştırma ile PHP üzerinde SETTER ve GETTER yapısını incelediğimde bu metodların aslında çokta doğru çalışmadığını gördüm.

Neden get ve set kullanırız? Sınıftaki property lere (türkçesi değişkenlere diyebiliriz. )  direk erişilmesi çoğu zaman işlem bütünlüğü açısından problem yaratabilir. Bu durumda bu property lere direk erişimi engellemek için bunları setter ve getter metodları ile erişime açık kılarız. Sınıfımız içerisindeki üzerinde işlem yapılacak değişlenlere erişim için sadece public olarak izin verdiğimiz metotlar(set,get) üzerinden erişilmesini ve herşeyi bir arada kullanılmasını istiyoruz.

Böylece o property lerimiz güvende kalmış olur.

Örnek vermem gerekirse, A diye bir tane sınıfımız var ve bu sınıfta email diye bir değişkenimiz mevcut. Sadece email değişkenine “admin” rütbesine sahip birinin değiştirebilmesini istiyorsun diyelim. O zaman değişkeni private / protected olarak tanımlarsınız ve getter setter metotlarıyla ulaşımı ve değiştirilmesini sağlarsınız. Böylece “data encapsulation” ı gerçekleştirmiş olursunuz.

Konuyu derinlemesine araştırmaya başladım. PHP.NET üzerinden şu şekilde bir bilgiye ulaştım.

Bilginize:

PHP’nin “aşırı yükleme” konusundaki yorumu çoğu nesne yönelimli dilden farklıdır. Aşırı yükleme geleneksel olarak, dile, farklı miktar ve türde değiştirgeye sahip aynı isimde çok sayıda yönteme sahip olabilme yeteneği sağlar.

Şimdi gelelim fasulyenin faydalarına bu methodları kullanalım, kullanalımda sonrasında kapsülleyelim derken kendi ayağımıza sıkmayalım?

Şöle bir test yaptım.

ÖRNEK 1 KODU:
class dog{

    public $name = "";

    public function setName($name){
      $this->name = $name;
    }

    public function getName(){
      return $this->name;
    }
}

 $rover = new dog();
  for($x = 0 ;$x < 10 ;$x++){
    $t = microtime(TRUE);
      for($i = 0 ;$i < 1000000 ;$i++){ $rover->setName("rover");
        $n = $rover->getName();
      }
    echo microtime(TRUE) - $t;
    echo "\n";
  }  
ÖRNEK 1 Sonuç :

1.48462200165
1.49136686325
1.48365998268
1.47310495377
1.46616101265
1.44583415985
1.42663908005
1.43124985695
1.42830300331
1.42891597748
ÖRNEK 2 KODU :

 class dog{
    public $name = "";
 }

    $rover = new dog();
    for($x = 0 ;$x < 10 ;$x++){
        $t = microtime(TRUE);
        for($i = 0 ;$i < 1000000 ;$i++){       
            $rover->name = "rover";
            $n = $rover->name;
        }
        echo microtime(TRUE) - $t;
        echo "\n";
    }

ÖRNEK 2 Sonuç :
0.700392007828
0.686674118042
0.687913894653
0.693347930908
0.697072982788
0.708423852921
0.709672927856
0.704964876175
0.704661130905
0.708118915558

Sonuçlar ortada.Durum böyle olunca kendimi PHP ile SPAGETTİ yazmanın daha mantıklı olduğuna kanaat getirdim :))))

 

Bundan böyle getter ve setter fonksiyonlarını kullanmayacağım.

 

The translated version is included : http://notes.io/w3gX
Have a nice day !

Bir Cevap Yazın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>