Web Geliştirici  :: PHP, Kohana, JavaScript, Ajax, XHTML, XML, CSS, MySQL ve diğer web yazılım geliştirme teknolojileri hakkında faydalı bilgi ve teknikler
 

PHP’de Nesne Yönelimli Programlama-12

Nesne Yöntemlerinin Aşırı Yüklenmesi (Method Overloading)

PHP’de nesne yöntemlerinin aşırı yüklenmesi, yöntemlerin farklı sayıda parametre alarak çalışabilmesini ifade eder. Bunun için bir yöntemin farklı sayıda parametre ile çalışabilen birden fazla kopyası tanımlanır.

Nesne yöntemlerinin aşırı yüklenmesi için, __call() veya __callStatic() sihirli yöntemlerinden faydalanılır.

class sinif {
 
    public function yontem1($x)
    {
        // "yontem" isimli yöntem, 1 parametre ile çağrılırsa bu yöntem çalışacak
 
        echo $x.'<br />';
    }
 
    public function yontem2($x, $y)
    {
        // "yontem" isimli yöntem, 2 parametre ile çağrılırsa bu yöntem çalışacak
 
        echo $x.' - '.$y;
    }
 
    public function __call($tanimsiz_yontem_adi, $parametreler)
    {
        if ($tanimsiz_yontem_adi == 'yontem')
        {
            $parametre_sayisi = count($parametreler);
 
            switch ($parametre_sayisi)
            {
                case 1:
                    // "yontem" isimli yöntem, 1 parametre ile çağrılırsa "yontem1" yöntemi çalıştırılsın
                    $calistirilacak_yontem_adi = 'yontem1';
                    break;
                case 2:
                    // "yontem" isimli yöntem, 2 parametre ile çağrılırsa "yontem2" yöntemi çalıştırılsın
                    $calistirilacak_yontem_adi = 'yontem2';
                    break;
                default:
                    throw new Exception('Eksik veya fazla parametre girdiniz!');
            }
 
            // Nesnemizin ilgili yöntemini parametrelerimizi de göndererek çalıştıralım
            call_user_func_array(array($this, $calistirilacak_yontem_adi), $parametreler);
 
            // Ek bilgi:
            // call_user_func_array() fonksiyonu, bir nesnenin bir yöntemini çalıştırmaya yarar
            // Kullanımı: call_user_func_array(array($nesne, $calistirilacak_yontem_adi), $parametre_dizisi)
        }
        else
        {
            throw new Exception('Tanımsız bir yöntem çağırdınız!');
        }
    }
 
}
 
$nesne = new sinif;
 
$nesne->yontem(3); // __call() devreye girer, yontem1() çalıştırılır
$nesne->yontem(3, 5); // __call() devreye girer, yontem2() çalıştırılır
 
// Olmayan static tanımlı bir yöntem çağrılırsa, __callStatic() devreye girer

Şimdi de farklı parametre sayısına göre farklı kurucu yöntemin çalıştığı bir örnek yapalım. Nesne oluşturulurken kaç parametre gönderilirse, ilgili kurucu yöntem devreye girsin.

class sinif {
 
    public function __construct()
    {
        // Nesne oluşturulurken gönderilen parametre sayısı
        $parametre_sayisi = func_num_args();
 
        // Nesne oluşturulurken gönderilen parametrelerden oluşan dizi
        $parametreler = func_get_args();
 
        // Nesne oluşturulurken, sınıf kaç parametre ile çağrıldı ise ilgili kurucu yöntem çalıştırılsın
        switch ($parametre_sayisi)
        {
            case 0: // Parametresiz kullanılmışsa
                $this->__call('__construct0', array());
                break;
            case 1: // 1 parametre ile kullanılmışsa
                $this->__call('__construct1', $parametreler);
                break;
            case 2: // 2 parametre ile kullanılmışsa
                $this->__call('__construct2', $parametreler);
                break;
            default: // Diğer durumlarda
                throw new Exception('Parametre sayısı hatalı!');
        }
    }
 
    public function __construct0() // Birinci yapılandırıcı yöntemimiz
    {
        echo '__construct0 çalıştı<br />';
    }
 
    public function __construct1($x) // İkinci yapılandırıcı yöntemimiz
    {
        echo '__construct1 çalıştı<br />';
    }
 
    public function __construct2($x, $y) // Üçüncü yapılandırıcı yöntemimiz
    {
        echo '__construct2 çalıştı';
    }
 
    public function __call($tanimsiz_yontem_adi, $parametreler)
    {
        if (substr($tanimsiz_yontem_adi, 0, 11) == '__construct')
        {
            call_user_func_array(array($this, $tanimsiz_yontem_adi), $parametreler);
        }
        else
        {
            throw new Exception('Tanımsız bir yöntem çağırdınız!');
        }
    }
 
}
 
$nesne0 = new sinif; // __construct0 çalıştırılır
$nesne1 = new sinif(3); // __construct1 çalıştırılır
$nesne2 = new sinif(3, 5); // __construct2 çalıştırılır

Yorum Yapın