PHP – Metottaki Closure Fonksiyondan Üye Metotu Çağırma

PHP’de bir sınıf (class) yazdınız ve bir metot içinde closure (isimsiz, anonim) fonksiyon kullandınız diyelim.
Ancak kodunuzun yapısı gereği bu oluşturduğunuz closure fonksiyondan yine aynı sınıf içerisinde ki başka bir metota (member method) erişmeniz gerekiyor.

Buradan sonra PHP 5.3’te işin rengi biraz değişiyor. :)

Normalde closure fonksiyondan bir başka fonksiyonu fonksiyonIsmi() şeklinde kolayca çağırabiliyorsunuz. Ancak sınıflarda bu durum biraz farklı işliyor.

İlk başta closure’dan $this->metodIsmi(); yapıldığında ilgili metota ulaşılabileceğinizi düşünmüş olabilirsiniz. Gayet yerinde bir düşünce :)

Bahsettiğim koda ulaşmak için buraya tıklayın.

Ancak kodun içinde de belirttiğim gibi PHP 5.3’te bu kod hata verecektir. Çünkü maalesef 5.3’te doğrudan $this ile erişim yapamıyorsunuz. Erişmek için $this değişkenini yerel bir değişkene atamalısınız. Ardından o değişkeni use anahtar kelimesi (keyword) ile closure fonksiyonda kullanmalısınız.

Örnek koda ulaşmak için buraya tıklayın.

Test ortamları: Linux Mint – PHP 5.3.10 (1. kod fatal error verdi. 2. kod çalıştı), Arch Linux – PHP 5.4.16 (İki kod da çalıştı), Scientific Linux – PHP 5.5.0beta1 (İki kod da çalıştı)

 
31 Kudos
Don't move
  1. Tanim biraz kafa karisikligina yol acabilir. Closure’larla anonim fonksiyonlarin tam olarak ayni anlama gelmediklerini biliyorum. Closure denebilmesi icin fonksiyonun bulundugu context uzerindeki degerleri paylasmasi gerekiyor. Bunun icin de illa anonim fonksiyon olmasina gerek yok. PHP’de bunlar nasil isliyor bilmiyorum, ancak Python, Javascript gibi dillerde durum bu sekilde.

    Bu arada guzel bir yazi olmus, tebrikler :)

  2. Merhaba, bahsettiğiniz Closure fonksiyonlar nerede ve ne zaman işimize yarar?

    • Adil İlhan

      Merhaba,

      benzer görevlere sahip bir dizi metot olduğunu varsayın. Bunlar için ayrı ayrı metot yapmak yerine closure metot yapabilirsiniz.

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>