PHP 5.3 Magic Yöntem __ invoke

3 Cevap php

Bu konu When do/should I use __construct(), __get(), __set(), and __call() in PHP? hangi __ inşa __ get ve __ set sihirli yöntemler bahsediyor genişletir.

PHP 5.3 'çağırmak __ adında yeni bir Magic Yöntem var. Bir komut bir fonksiyonu olarak bir nesneyi aramaya çalıştığında __ Invoke yöntemi denir.

Şimdi bu yöntem için yapmış araştırma, insanların Java yönteme benzetmek () çalıştırın -. Bkz Interface Runnable.

Düşündüm sonra uzun ve ben) $ (obj çağırır neden herhangi bir nedenle düşünemiyorum bu konuda zor; $ obj-> function () karşıt olarak;

Nesnelerin bir dizi yineleme olsa bile, yine de çalıştırmak isterim ana fonksiyonu adını bilemez.

Yani bir __ sihirli yöntemini PHP kısayol ya da bu aslında yapmak doğru şey olacaktır durumlar vardır 'Eğer gerektiği anlamına gelmez sırf' Başka bir örnek çağırmak?

3 Cevap

PHP diğer diller gibi işlev işaretçileri geçişine izin vermez. Fonksiyonlar first class PHP değildir. Birinci sınıf olma fonksiyonları esas Eğer bir değişken için bir işlev kaydetmek ve çevresinde onu geçmek ve herhangi bir zamanda çalıştırmak anlamına gelir.

__invoke yöntemi PHP pseudo-birinci-sınıf fonksiyonları ağırlayacak bir yoludur.

__invoke yöntemi closure veya continuation olarak hareket, ya da sadece etrafında geçebilir bir fonksiyonu olarak bir sınıf geçmek için kullanılabilir.

Fonksiyonel programlama bir çok birinci sınıf fonksiyonları üzerine dayanır. Hatta normal zorunludur programlama bu yararlanabilir.

Eğer bir tür rutin vardı, ama farklı karşılaştırmak fonksiyonları desteklemek istedim söylüyorlar. Peki, farklı uygulamak sınıfları karşılaştırın olabilir __ işlevini çağırmak ve sıralama işlevi sınıfına durumlarda geçmek ve hatta işlevin adını bilmek zorunda değildir.

Gerçekten, her zaman bir sınıf geçme gibi bir şey yapmış ve bir fonksiyon yöntemini çağırın var, ama diğer dillerde gibi temiz olmasa da artık neredeyse bir "fonksiyonu" Geçen yerine bir sınıf geçme hakkında konuşabilirsiniz olabilirdi.

Ben bu işlevselliği 5.3 'ler yeni bir kapatma işlevlerini desteklemek için ağırlıklı olarak var olduğuna inanıyorum. Kapaklar Closure sınıfın örnekleri olarak maruz kalan ve doğrudan Invokable örneğin vardır $foo = $someClosure();. Pratik bir yararı __invoke() bunun yerine size bir işlevi, örnek yöntemi veya statik yöntemine başvuru olmanıza bağlı dizeleri, nesneler ve diziler garip kombinasyonları kullanarak yerine, standart bir geri arama türü oluşturmak mümkün hale geliyor.

Bu iki şey bir arada bulunuyor. Doğru zaten bunlardan birini tespit ettik. Bu sadece her "çalıştırılabilir" nesne aynı yöntemi uygulayan Java'nın IRunnable arayüzü gibi gerçekten. Java, yöntem adlandırılır run; PHP, yöntem, __invoke adlandırılır ve açıkça daha önce herhangi bir arayüz tipi uygulamak gerekmez.

Ikinci yönü syntactic sugar, bu nedenle yerine $obj->__invoke(), yöntem adını atlayabilirsiniz çağırıyor, böylece doğrudan nesneyi diyorsun sanki belirirse: {[(2) }].

Kilitlere sahip PHP için önemli kısmı ilk biridir. Dil onun bir şey yapmak için bir kapatma nesne üzerinde çağırmak için bazı kurulmuş bir yöntem gereklidir. Çift çizgi öneklerle tüm "özel" fonksiyonları ile olduğu gibi sözdizimsel şeker, daha az çirkin görünmesi için sadece bir yoludur.