2011-02-11 9 views
11

Chcę używać interfejsów, ale niektóre z moich wdrożeń opierają się na magicznych metodach, takich jak __invoke i __call. Muszę usunąć sygnatury metod, które mogą być wywoływane magicznie (w dowolnej implementacji) z interfejsu. Co prowadzi do anty-wzorcowego pustego interfejsu (Tak, właśnie to wymyśliłem).Jak używać interfejsów i magicznych metod w PHP

Jak połączyć interfejsy i magiczne metody w PHP?

+0

Klasy abstrakcyjne, być może. – BoltClock

+0

Może cię źle zrozumiałem. Próbowałem zdefiniować klasę Przykład, który rozszerza ABase i implementuje IA. Metoda interfejsu jest deklarowana jako abstrakcyjna w Base, a przykład ma tylko metodę __call(). PHP mówi: PHP Błąd krytyczny: Klasa ABase zawiera 1 abstrakcyjną metodę i dlatego musi zostać uznana za abstrakcyjną lub zaimplementować pozostałe metody (ABase :: do_something) –

+0

Podstawy: rodzic (baza) ma metodę abstrakcyjną. Dlatego każde dziecko MUSI wdrożyć metodę. To samo dotyczy interfejsów. Więc jeśli Base implementuje IA, a Base deklaruje zastosowanie metody jako abstrakcyjnej, jesteś zmuszony zastosować tę metodę u każdego dziecka. Błąd mówi, że to wszystko ^^ – usoban

Odpowiedz

11

Mieć wszystkie metody interfejsu w wysyłaniu implementacji do __call(). Wiąże się to z dużą ilością marnej roboty, ale działa.

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) { 
     ... 
    } 
} 

Przynajmniej ciało każdej metody może być identyczne. ;)

+1

To nie jest zły pomysł! Płyty kotła można rozwiązać, generując kod pamięci podręcznej, jeśli stanie się to problemem. –

+1

W zależności od tego, jak działa funkcja dodawania, możesz dodać instrukcję return. – SeanDowney

+0

@SeanDowney - Dobry punkt. –

Powiązane problemy