2009-03-16 28 views
81

¿Puede una clase extender una interfaz y otra clase en PHP?
Básicamente quiero hacer esto:¿Puede una clase extender una clase e implementar una interfaz?

interface databaseInterface{ 
public function query($q); 
public function escape($s); 
//more methods 
} 

class database{ //extends both mysqli and implements databaseInterface 
//etc. 
} 

¿Cómo se podría hacer esto, simplemente haciendo:

class database implements databaseInterface extends mysqli{ 

resulta en un error fatal:

 
Parse error: syntax error, unexpected T_EXTENDS, expecting '{' in *file* on line *line* 
+16

cómo es esto demasiado localizado ?! "Es poco probable que esta pregunta ayude a futuros visitantes". ¡Sin embargo, la mejor respuesta tiene 33 votos ascendentes y la pregunta 4 estrellas! –

Respuesta

138

probarlo a la inversa alrededor de:

class database extends mysqli implements databaseInterface { ...} 

Esto debería funcionar.

+0

Ahh, muchas gracias. ¿Por qué exactamente es que deberían ser al revés? –

+11

Dado que solo puede heredar una clase y puede implementar cualquier cantidad de interfaces, probablemente haya sido una sintaxis del azúcar. Además, recuerde, si su subclase implementa cualquier interfaz, eso también se mostraría en la lista de métodos implementados. Entonces ponerlos en ese orden tiene cierto sentido. – Drew

17

Sí, puede. Solo necesita conservar el orden correcto.

class database extends mysqli implements databaseInterface { ... } 

Además, una clase puede implementar más de una interfaz. Solo sepárelos con comas.

Sin embargo, me siento obligado a advertirle que extendiendo la clase mysqli es increíblemente mala idea. La herencia per se es probablemente el concepto más sobrevalorado y mal utilizado en la programación orientada a objetos.

En cambio, aconsejaría hacer cosas relacionadas con DB de la manera mysqli (o manera PDO).

Además, una cosa menor, pero las convenciones de nomenclatura son importantes. Su clase database parece más general que mysqli, por lo tanto, sugiere que este último hereda de database y no es el camino correcto.

+1

¿Por qué la extensión de la clase mysqli es una mala idea? –

+10

Primero, porque no es tuyo. Cuando los chicos de mysqli deciden cambiar algo, el comportamiento de la subclase también cambiará. En segundo lugar, la herencia se utiliza para ESPECIALIZAR, no EXTENDER con funcionalidad adicional. Esta es la cosa más incomprendida en OOP. Como regla general, tiendo a extender clases abstractas solamente. –

+0

Michal: ¿cómo sería un cambio en mysqli diferente para un desarrollador que utiliza un enfoque polimórfico frente a uno agregado/compuesto? Aún deberá actualizar su código para manejar los cambios. –

3

sí, de hecho, si se desea implementar múltiples interfaces que se pueden hacer como esto:

public class MyClass extends BaseClass implements myInterface1, myInterface2, myInterface3{ 

} 
Cuestiones relacionadas