PHP Sihirli Metodlar

Sihirli Yöntemler de nedir, uydurma diyebilirsiniz :) PHP dökümanlarında Magic Methods olarak geçmektedir.

Magic Methods aslında bilmediğiniz birşey değil. Nesne Yönelimli Programlamada kullanılan;

  • Constructor
  • Destructor
  • toString

gibi metotlar bu işe örnek olabiliyor.

PHP'nin OOP desteği sayesinde sayfaları daha da işlevli hale getirebilmek mümkün hale getirilmiş durumda.

PHP'de bulunan Sihirli Metotlar şöyle;

  • __construct()
  • __destruct()
  • __get()
  • __set()
  • __isset()
  • __call()
  • __callStatic()
  • __toString()
  • __clone()
  • __sleep

__construct() metodu

Construct yani Constructor, kelime manasıyla yapıcı metot demektir. Yani bir sınıf üretildiğinde uğrayacağı metot olarak bilinir. Bir class oluşturulduğunda boş yada dolu bu constructor sınıf üretilme esnasında çalışır.

Class Kedi {
    private $ad;
    //constructor
    public function __construct($ad) {
        $this->ad = $ad;
    }
    public function getAd() {
        echo $this->ad;
    }
}
//Dolu constructor seviyesinde Kedi Sınıfı içerisine argüman ile değer set ettik, yani ad değişkeni değerini dolu constructor seviyesinde doldurduk.
$Cat = new Kedi('Tom');
$Cat->getAd(); //Çıktı: Tom

__destruct() metodu

Destruct ise Construct'un (Yapıcı) tersine Yıkıcı görevi üstlenir. Yani bu sınıf sona ermeden önce yapılacak son görev manasına gelmektedir. Desctruct yapısı manasıyla argüman almaz. __desctruct() metodu tetiklenebilmesi için unset($SinifAdi) ile çağırılır.

Class Kedi {
    private $ad;
    //constructor
    public function __construct($ad) {
        $this->ad = $ad;
    }
    public function getAd() {
        echo $this->ad;
    }
	public function __destruct() {
        echo "Destruct metodu çalıştı";
    }
}
 
$Cat = new Kedi('Tom');
$Cat->getAd(); //Çıktı: Tom
unset($Cat);

get metodu

get ve set metotları OOP İlkelerinden olmassa olmaz bir ilke olan Encapsulation (Kapsülleme) başlığının kurallarındandır. Kapsülleme işlemi yapabilmek için ilgili sınıfta fieldlar(Değişkenler), boş ve dolu constructorlar, her field için get ve set metotların üretilmesi gerekir.

Get metotları yapısı gereği, private erişim seviyesine sahip değişkenlerin değerlerine güvenli olarak erişebilmek için kullanılır. metod adı get ile başlıyorsa getter (değer getir) demektir.

Class Kedi {
    private $ad;
	private $yas
    public function __construct($ad,$yas) {
        $this->ad = $ad;
		$this->yas = $yas;
    }
    public function getAd() {
        echo $this->ad;
    }
	public function __destruct() {
        echo "Destruct metodu çalıştı";
    }
}
$Cat = new Kedi('Tom',2);
$Cat->getAd(); //Çıktı: Tom

set() metodu

Set metotları ise, private fieldların değerlerine güvenli olarak değer ataması yapılabilmesini ifade etmektedir. Set metotlarının yaptığı işi, dolu constructor da yapabilir. Metot adı set ile başlıyorsa setter (değer ata) demektir.

__get() metodu

Benim PHP de gördüğüm efsane bir yapı. Bu yapının aynısı Java SE'de yok, ne kadar field o kadar getter setter metot üretilmesi gerekiyor. İşin esprisi şu, get metotları tek tek eklemenize gerek yok, argüman olarak içine ne gönderirseniz field olarak arayıp onu return ediyor bu metot. Aynı yapıyı .net de de görmüştüm.

Class Kedi {
    private $ad;
	private $yas;
    public function __construct($yas,$ad) {
        $this->ad = $ad;
		$this->yas = $yas;
    }
    public function getYas() {
        echo $this->yas;
    }
	public function __get($name) {
		if(property_exists($this, $name)) {
			return $this->$name;
		}
	}
}
$Cat = new Kedi(2,"Tom");
echo $Cat->ad; // Çıktı: Tom, Örnekte ad için getter yazmamama rağmen, __get ile varsa yazılmış gibi davranmış olduk.

__set() metodu

tüm set metotları __set() ile üretilebilmesine olanak tanıyabilirsiniz.

Class Kedi {
    private $ad;
	private $yas;
    public function __construct($yas,$ad) {
        $this->ad = $ad;
		$this->yas = $yas;
    }
    public function getYas() {
        echo $this->yas;
    }
	public function __set($property,$value) {
		 $this->$property = $value;
	}
}
$Cat = new Kedi(2,"Tom");
$Cat->cinsiyet = "Erkek"; // Olmadığı halde cinsiyet field'ına değer atadım
echo $Cat->cinsiyet;  //ve değeri çağırdım

__isset() metodu

__isset metodu da güzel bir yapıya sahip. Normalde isset'i kullanıyoruz. Herhangi bir field değeri tanımlı mı değil mi kontrolünü global bir metot ile sağlayabiliyoruz.

Class Kedi {
    private $ad;
	private $yas;
    public function __construct($yas,$ad) {
        $this->ad = $ad;
		$this->yas = $yas;
    }
	public function __set($property, $value) {
        $this->$property = $value;
    }
    /** PHP 5.1.0'dan itibaren */
    public function __isset($name) {
		return isset($this->$name);
    }
}
$Cat = new Kedi(2,"Tom");
if(isset($Cat->cinsiyet)){
	echo "cinsiyet fieldi var";
}else{
	echo "cinsiyet fieldi yok";
};

__call() metodu

Bu metot ile bir get metodun var olup olmadığını yakalayabilirsiniz.

Class Kedi {
    private $ad;
	private $yas;
    public function __construct($yas,$ad) {
        $this->ad = $ad;
		$this->yas = $yas;
    }
	public function getAd() {
        echo $this->ad;
    }
	public function __call($name, $arguments) {
        echo $name." Doesn't exists";
    }
}
$Cat = new Kedi(2,"Tom");
$Cat->getCinsiyet(); // eğer bu metot varsa değerini, yoksa call metodundaki yazıyı döndürür

__callStatic() metodu

aslında __callStatic ile __call aynı işi yapıyor $Cat->getCinsiyet() yerine $Cat::getCinsiyet() gibi çağırmak isteyebilirsiniz. Bu yapı Singleton Pattern'e de bir örnek.

Class Kedi {
    private $yas;
    private $ad;
    public function __construct($yas, $ad) {
        $this->yas = $yas;
        $this->ad = $ad;
    }
    public function getYas() {
        echo $this->yas;
    }
    public static function __callStatic($name, $arguments) {
        echo $name." Doesn't exists";
    }
}
$Kedi = new Kedi(1, "MırMır");
$Kedi::getAddress();

__toString() metodu

toString metodu ile sınıf üretildiğinde sınıfın get metotlarını tek seferde döndürmek isteyebilirsiniz. toString objeyi string olarak döndürür.

Class Kedi {
    private $yas;
    private $ad;
    public function __construct($yas, $ad) {
        $this->yas = $yas;
        $this->ad = $ad;
    }
    
    public function __toString() {
        return "Kedinin adı: ".$this->ad." ve yaşı: ". $this->yas;
    }
}
 
echo new Kedi(1, "MırMır");

__clone() metodu

Bir nesneyi farklı bir değişkene aynı değerlerini kopyalamak isteyebilirsiniz, Javada bu işe Object Instance deniyor.

Class Kedi {
    private $yas;
    private $ad;
    public function __construct($yas, $ad) {
        $this->yas = $yas;
        $this->ad = $ad;
    }
    public function __clone() {
    }
}
 
$Kedi = new Kedi(1, "MırMır");
$Kedi2 = clone $Kedi;
var_dump($Kedi);
var_dump($Kedi2);
Bu makaleyi paylaşın:

3 Comments

Bir yorum bırakın