2011-02-11 18 views
11

Voglio utilizzare le interfacce, ma alcune delle mie implementazioni si basano su metodi magici come __invoke e __call. Devo rimuovere le firme dei metodi che possono essere richiamati magicamente (in qualsiasi implementazione) dall'interfaccia. Il che porta all'interfaccia vuota anti-pattern (Sì, l'ho appena inventato).Come utilizzare interfacce e metodi magici in PHP

Come si combinano interfacce e metodi magici in PHP?

+0

Classi astratte, forse. – BoltClock

+0

Forse ti ho frainteso. Ho provato a definire un esempio di classe che estende ABase e implementa IA. Il metodo dell'interfaccia è dichiarato astratto in Base e l'Esempio ha solo un metodo __call(). PHP dice: PHP Errore fatale: Class ABase contiene 1 metodo astratto e deve quindi essere dichiarato astratto o implementare i restanti metodi (ABase :: do_something) –

+0

Bene, i fondamenti: parent (Base) ha un metodo astratto. Pertanto, qualsiasi bambino DEVE implementare il metodo. Lo stesso è con le interfacce. Quindi, se Base implementa IA e Base dichiara la sua implementazione del metodo come astratta, sei costretto a implementare il metodo in qualsiasi bambino. L'errore dice tutto ^^ – usoban

risposta

11

Tutti i metodi di interfaccia nelle implementazioni vengono inviati a __call(). Comporta un sacco di lavoro scadente di taglia-e-incolla, ma funziona.

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

Almeno il corpo di ciascun metodo può essere identico. ;)

+1

Questa non è una cattiva idea! E il materiale della piastra della caldaia può essere risolto con la generazione del codice di caching se diventa un problema. –

+1

A seconda di come funziona la funzione di aggiunta, è possibile che si desideri aggiungere un'istruzione di reso. – SeanDowney

+0

@SeanDowney - Buon punto. –