Aşırı yükleme, geleneksel programlamada bir fonksiyonun farklı sayıda parametre alan versiyonlarını tanımlayarak farklı işlevleri yerine getirecek şekilde çalıştırılabilmesini sağlamaktır. PHP de ise geleneksel programlamadan farklı olarak çalışır. Bazı sihirli metodları kullanarak, olay tabanlı çalışan -daha doğrusu callback mantığıyla çalışan- bir yapısı vardır.

Bir nesne üzerinden sınıfın herhangi bir elemanına erişebilirsiniz. Fakat o sınıfın elemanı olarak tanımlanmamış bir elemana ulaşmanız da mümkündür.

Bir yazar sınıfı tanımlayalım.

class yazar {
public $ad;
public $mail;
public $numara;
}
Bir nesne oluşturup, sınıfın eleman sahalarına erişelim.



$nesne = new yazar();
$nesne->ad = "Cem Demir"; // Çalışır
$nesne->mail = "[email protected]"; // Çalışır
$nesne->numara = 1; // Çalışır
$nesne->isim = "Cem Demir";
/* 5. satırda, eğer tanımlanmışsa aşırı yükleme devreye girecektir.*/
“isim” elemanı sınıfın içerisinde tanımlanmış bir eleman saha değildir. Dolayısıyla eğer programda aşırı yükleme kullanılmamışsa hata oluşacaktır. Aşırı yüklemenin ne olduğuna ve nasıl yapıldığına bakalım.

Aşırı yükleme nesne üzerinden, sınıfın aslında mevcut olmayan elemanlarına (aynen yukarıdaki gibi – isim) erişilmeye çalışıldığında devreye girer. Aşırı yükleme, hem eleman sahalar (değişkenler), hem de eleman fonksiyonlar için yapılabilmektedir.

Aşırı yükleme yapabilmek için bazı sihirli fonksiyonları kullanmak gerekir. Eleman sahalar için __get ve __set fonksiyonları, eleman fonksiyonlar için __call fonksiyonu kullanılır.

Sınıfta mevcut olmayan bir değişkene veri yazmaya çalışırken __set fonksiyonu devreye girer. 2 parametre alır. Birisi değişkenin ismini, diğeri de içeriğini tutar.


public function __set($isim, $deger) {
echo "__set fonksiyonu çağrıldı. <br/>
Kullanılan değişken adı : $isim <br/>
Değişken değeri : $deger <br/><br/>";
$this->ad = $deger;
}
__set fonksiyonunun çalışması için aşağıdaki gibi bir atama (veri yazma) işlemi yapılmalıdır. (Nesnenin, aslında mevcut olmayan bir değişkenine atama yapılıyor – ismi)


$nesne = new yazar();
$nesne->isim = "Cem Demir"; // __set devreye girecek.
Sınıfın mevcut olmayan bir değişkeninden veri okumaya çalışırken __get fonksiyonu devreye girer. 1 parametre alır ve kullanılan değişkenin adını temsil eder.


public function __get($isim) {
echo "__get fonksiyonu çağrıldı. <br/>
Kullanılan değişken adı : $isim <br/>";
return $this->ad;
}
__get fonksiyonunun çalışması için echo ile sınıfta mevcut olmayan bir veriyi okuyalım.


$nesne = new yazar();
$nesne->isim = "Cem Demir"; // __set devreye girecek.
echo $nesne->isim; // __get devreye girecek.
Eleman sahalar bu şekilde, __set ve __get fonksiyonlarıyla aşırı yüklenebiliyor. Şimdi de eleman fonksiyonlarda aşırı yüklemeye bakalım.

Fonksiyonları aşırı yüklemek için __call fonksiyonu kullanılır. İki parametre alır, birisi fonksiyonun ismi, diğeri ise değerleri içeren bir dizidir.


public function __call($isim, $dizi) {
echo "Kullanılan fonksiyonun ismi : $isim <br/>";
echo $this->ad = $dizi[0] . "<br/>";
echo $this->mail = $dizi[1] . "<br/>";
echo $this->numara = $dizi[2] . "<br/>";
}
__call fonksiyonunu çalışması için sınıfın elemanı olmayan bir fonksiyon kullanalım.


$nesne = new yazar();
$nesne->degerleriYaz("Cem Demir", "[email protected]", 1);
Aşırı yükleme genel olarak __get, __set ve __call fonksiyonları ile yapılmaktadır. Bu fonksiyonlar PHP de sihirli fonksiyonlar (metodlar) olarak adlandırılır. Bu metodların haricinde birkaç sihirli metod daha bulunmaktadır.

__callStatic : Sınıfta mevcut olmayan bir static fonksiyon çağrıldığında devreye girer.
__isset : Sınıfta mevcut olmayan bir elemana isset fonksiyonu uygulandığında devreye girer.
__unset : Sınıfta mevcut olmayan bir elemana unset fonksiyonu uygulandığında devreye girer.



aLinti...