2011-02-11 18 views
11

Quiero usar interfaces, pero algunas de mis implementaciones se basan en métodos mágicos como __invoke y __call. Tengo que eliminar las firmas de los métodos que pueden invocarse mágicamente (en cualquier implementación) desde la interfaz. Lo que lleva a la interfaz vacía anti patrón (Sí, acabo de inventar eso).Cómo usar interfaces y métodos mágicos en PHP

¿Cómo se combinan las interfaces y los métodos mágicos en PHP?

+0

Clases abstractas, quizás. – BoltClock

+0

Quizás te malinterprete. Intenté definir un ejemplo de clase que amplía un ABase e implementa IA. El método de interfaz se declara abstracto en Base y el ejemplo solo tiene un método __call(). PHP dice: PHP Fatal error: Class ABase contiene 1 método abstracto y por lo tanto debe declararse abstracto o implementar los métodos restantes (ABase :: do_something) –

+0

Bueno, los fundamentos: parent (Base) tiene un método abstracto. Por lo tanto, cualquier niño DEBE implementar el método. Lo mismo es con las interfaces. Entonces, si Base implementa IA, y Base declara su implementación de método como abstracta, se le obliga a implementar el método en cualquier elemento secundario. El error lo dice todo ^^ – usoban

Respuesta

11

Tiene todos los métodos de interfaz en su envío de implementaciones al __call(). Implica una gran cantidad de trabajo de cortar y pegar, pero funciona.

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

Al menos el cuerpo de cada método puede ser idéntico. ;)

+1

¡Esto no es una mala idea! Y las cosas de la placa de la caldera pueden resolverse con la generación de código de almacenamiento en caché si se convierte en un problema. –

+1

Dependiendo de cómo funcione la función de agregar, puede agregar una declaración de devolución. – SeanDowney

+0

@SeanDowney - Buen punto. –

Cuestiones relacionadas