• Şuradasınız
  • Anasayfa
  • PHP
  • PHP : Aşırı Yükleme ve Sihirli Fonksiyonlar

PHP : Aşırı Yükleme ve Sihirli Fonksiyonlar

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 = "cem@demir.net"; // Ç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", "cem@demir.net", 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.

Yazdıklarım biraz yüzeysel kalmış olabilir. İleriki günlerde, aşırı yüklemeyi kullandılça daha somut ve anlaşılır örnekler verebilirim diye umuyorum.

Benzer Yazılar

Yorumlar

  • Yusuf , 25 Nisan 2013 - 18:51:26

    Her ne kadar beceremesemde :) çok tşk.ler emeğine sağlık

    Cevapla
  • Mehmet Çavdaroğlu , 16 Haziran 2013 - 03:44:40

    Merhaba,

    Benim bir sorunum var ve bu konuyla ilgili olabileceğini düşünüyorum. Günlerdir uğraşmama rağmen içinden çıkamadım.

    Controller’dan Model çağırırken,

    => $this->load->model(“model_ismi”);

    diyerek çağırmak istiyorum. Bu model’ı kullanırken de,

    => $this->model_ismi->kullanilacak_metod();

    şeklinde kullanmak istiyorum. Ancak geriye dönecek Model’ı model’ın isminde bir değişkene atmasını istiyorum. Bu işlemi ben yapmayayım program yapsın. Bunu bir türlü başaramadım. Şimdilik kullandığım yöntem şu şekilde,

    => $model = $this->load->model(“model_ismi”);
    => $model->metod_ismi();

    Acaba bu sorunu nasıl aşarım?

    Cevapla
    • Cem Demir , 20 Şubat 2014 - 17:13:27

      Merhaba, sanırım bu işlemi CodeIgniter ile yapmaya çalışıyorsunuz.

      $this->load->model('Model_name', 'model');
      $model= $this->model;
      $model->metho_ismi();
      

      Yukarıdaki kodu denemedim ama çalışacağını düşünüyorum.

      Cevapla
  • Hakan , 05 Temmuz 2013 - 17:48:08

    Teşekkürler dostum paylaşımların bir harika :=)

    Cevapla
  • Tuğrul Gençoğlu , 13 Eylül 2015 - 17:18:34

    Eline sağlık dostum bilgilendirici konular bunlar sağol.

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla