2011-02-11 18 views
11

Arabirimleri kullanmak istiyorum, ancak bazı uygulamalarım __invoke ve __call gibi sihirli yöntemlere dayanıyor. Arayüzden sihirli bir şekilde (herhangi bir uygulamada) çağrılabilecek yöntem imzalarını kaldırmam gerekiyor. Hangi anti-desen Boş Arabirimi yol açar (Evet, ben sadece bunu yaptım).PHP'de arayüzler ve sihir yöntemleri nasıl kullanılır?

PHP'de arayüzleri ve sihir yöntemlerini nasıl birleştiriyorsunuz?

+0

Soyut sınıflar, belki de. – BoltClock

+0

Belki seni yanlış anlıyorum. Bir ABase uzatan ve IA uygulayan bir sınıf örneği tanımlamaya çalıştım. Arabirim yöntemi, Base'de özet olarak bildirilmiştir ve Örnek yalnızca bir __call() yöntemine sahiptir. PHP diyor ki: PHP Ölümcül hata: Sınıf ABase 1 soyut yöntem içerir ve bu nedenle soyut veya beyan edilen yöntemleri uygulamak gerekir (ABase :: do_something) –

+0

Peki, temelleri: Ebeveyn (Base) soyut bir yöntem vardır. Bu nedenle, herhangi bir çocuk yöntemi uygulamalıdır. Aynı arayüzler ile. Yani eğer ÜE uygularsa ve üs metodun soyut olarak uygulanmasını ilan ederse, herhangi bir çocukta yöntemi uygulamaya zorlanırsınız. Hata tüm ^^ – usoban

cevap

11

Uygulamalarınızdaki tüm arabirim yöntemlerinin __call()'a gönderilmesini sağlayın. Çok fazla crummy kes-yapıştır işi içeriyor ama işe yarıyor.

interface Adder { 
    public function add($x, $y); 
} 

class Calculator implements Adder { 
    public function add($x, $y) { 
     return $this->__call(__FUNCTION__, func_get_args()); 
    } 

    public function __call($method, $args) { 
     ... 
    } 
} 

En azından her yöntemin gövdesi aynı olabilir.()

+1

Bu kötü bir fikir değil! Ve bir sorun olursa, kazan levhası malzemesi önbellek kod üretimi ile çözülebilir. –

+1

Ekleme işlevinin nasıl çalıştığına bağlı olarak, return ifadesi eklemek isteyebilirsiniz. – SeanDowney

+0

@SeanDowney - İyi nokta. –

İlgili konular