Yücel Alkan

PHP OOP Yapısında Overloading

Merhabalar. Bu yazımda PHP Object Oriented Programming yapısında overloading kullanımından bahsedeceğim. Overloading kelime olarak Türkçe'ye aşırı yükleme olarak çevrilmiştir.

Programlama dillerindeki overloading işlemi ile PHP'deki biraz farklı. Mesela Java'daki overloading işlemi ile aynı isimde iki tane metot oluşturup, bu metotların parametre sayılarını veya gelen parametrelerin değişken türlerini farklı tutabilirsiniz. 

Mesela; 

public void topla(int x, int y){
    System.out.println(x+y);
}

public void topla(double x, double y){
    System.out.println(x+y);
}

Java'da bu şekilde aynı isme sahip iki tane metot oluşturup, gönderdiğiniz parametrelerin türlerine göre hangisinin çalışacağınız belirleyebilirsiniz. 

Ancak PHP durum biraz farklı. PHP OOP yapısında overloading işlemi, class içerisinde tanımlanmayan bir özelliğe, nesne oluşturduktan sonra değer atamayı ifade ediyor. Aşağıdaki örneği incelediğiniz zaman ne demek istediğimi anlayacaksınız. 

class Futbolcu
{
    public $adSoyad;
    public $yas;
}

$futbolcu = new Futbolcu();
$futbolcu->adSoyad = "Nurullah Aslan";
$futbolcu->yas = 22;

$futbolcu->takim = "Samsunspor";

Dikkat ettiyseniz Futbolcu class'ı içerisinde adSoyad ve yas özellikleri tanımlı. Biz bu class'ı kullanıp nesne oluşturduktan sonra adSoyad ve yas özelliklerine değer atadık. 

Ancak Futbolcu class'ı içerisinde takim özelliği olmamasına rağmen biz nesne üzerinden bu özelliğe değer atama işlemi gerçekleştirdik. İşte PHP OOP yapısında overloading yapısı tam olarak da bunu ifade ediyor. 

Yazımın başında belirttiğim gibi Java'da overloading işlemi ile aynı isme sahip iki fonksiyon tanımlayıp kullanabiliyorsunuz. Ancak PHP'de böyle bir durum söz konusu değil. 

Tekrar PHP'ye geri dönelim. Yukarıda oluşturduğumuz nesneyi ekrana yazdırdığımız zaman nasıl bir yapıyla karşılaşacağımıza bir bakalım. print_r veya var_dump kullanarak bu işlemi gerçekleştirebiliriz. 

print_r($futbolcu);

Bu kodu çalıştırdığımız zaman aşağıdaki çıktıyla karşılaşacağız. 

Futbolcu Object ( [adSoyad] => Nurullah Aslan [yas] => 22 [takim] => Samsunspor )

Gördüğünüz gibi $futbolcu nesnesi içinde takim özelliği yer alıyor. İşte bu özelliği overloading sayesinde tanıtmış olduk. 

Overloaing İşlemini Tespit Etmek ve Önlemek

Class içerisinde tanımlanmayan bir özelliğe, nesne üzerinden değer atamak yani overloading yapmak çok da mantıklı bir kullanım değildir ve sistem hatalarına neden olabilir. Peki Overloading işlemini tespit edip, bu işlemi kontrol edebilir miyiz? Tabi ki de evet. 

PHP'de yer alan sihirbaz metotlar sayesinde overloading işlemini tespit edebilir ve bu durumda yapılacak işlemleri kontrol edebilirsiniz. Konuyla ilgili yazdığım içeriğe bu linkten erişim sağlayabilirsiniz. 

Overloading işlemini kontrol etmek için aşağıdaki sihirbaz metotları kullanabilirsiniz. 

__set: Class içinde tanımlı olmayan bir özelliğe değer atamak istediğimizde tetiklenir. 

__get: Class içinde tanımlı olmayan bir özelliğe erişim sağlamak yani değerini öğrenmek istediğimizde çalışır. 

__call: Class içinde tanımlı olmayan bir fonksiyonu kullanmak istediğimizde çalışır. 

__callStatic: Class içinde tanımlı olmaya static bir fonksiyonu kullanmak istediğimizde çalışır. 

Yukarıdaki örneğimizde takim özelliğine değer atamak istediğimizde hata mesajı vermek ve bu durumu engellemek için aşağıdaki yapıyı kullanabiliriz.
 

class Futbolcu
{
    public $adSoyad;
    public $yas;

    public function __set($ozellik, $deger)
    {
        echo "Class içinde tanımlı olmayan '$ozellik' özelliğine değer atayamazsınız.";
    }
}

$futbolcu = new Futbolcu();
$futbolcu->adSoyad = "Nurullah Aslan";
$futbolcu->yas = 22;

$futbolcu->takim = "Samsunspor";

Bu kodları çalıştırdığımız zaman $futbolcu nesnesinin takim özelliğine değer atayamayacak ve aşağıdaki hatayla karşılaşacağız. 

Class içinde tanımlı olmayan 'takim' özelliğine değer atayamazsınız.

Aynı örnekte bu sefer __get() sihirbaz metodunu da tanımlayalım ve kullanalım. 

class Futbolcu
{
    public $adSoyad;
    public $yas;

    public function __set($ozellik, $deger)
    {
        echo "Class içinde tanımlı olmayan '$ozellik' özelliğine değer atayamazsınız.";
    }

    public function __get($ozellik)
    {
        echo "Class içinde '$ozellik' özelliği tanımlı değildir. ";
    }
}

$futbolcu = new Futbolcu();
$futbolcu->adSoyad = "Nurullah Aslan";
$futbolcu->yas = 22;

$futbolcu->takim = "Samsunspor";        // __set sihirli metodu çalışacaktır.

echo $futbolcu->boy;                    // __get sihirli metodu çalışacaktır.

Bu kodların ekran çıktısı aşağıdaki gibi olacaktır. 

Class içinde tanımlı olmayan 'takim' özelliğine değer atayamazsınız.
Class içinde 'boy' özelliği tanımlı değildir.

Örneklerden de anlaşılacağı gibi overloading kullanımını sihirbaz metotlarla kontrol altına alabilir ve önleyebilirsiniz. Küçük çaplı projelerde sorun oluşturmasa da büyük projelerde kesinlikle sistemin çalışmasını aksatacak ve zaman kaybı yaşamanıza neden olacaktır. Bu durumda hayati öneme sahip __set ve __get sihirbaz metotlarını kullanabilirsiniz. 

Soru ve görüşlerinizi yorum olarak belirtebilirsiniz. Hayırlı çalışmalar dilerim.

Yorumlar
Bu içeriğe henüz yorum yapılmamıştır. İlk yorum yapan siz olun!
Yorum Yapın