2009-03-16 7 views
81

Une classe peut-elle étendre à la fois une interface et une autre classe en PHP?
Fondamentalement, je veux le faire:Une classe peut-elle étendre une classe et implémenter une interface

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

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

Comment peut-on faire cela, il suffit de faire:

class database implements databaseInterface extends mysqli{ 

résultats dans une erreur fatale:

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

Comment est-ce trop ?! localisés "Cette question est peu susceptible d'aider les futurs visiteurs". Pourtant la meilleure réponse a 33 upvotes et la question 4 étoiles! –

Répondre

138

Essayez-le dans l'autre sens environ:

class database extends mysqli implements databaseInterface { ...} 

Cela devrait fonctionner.

+0

Ahh, merci beaucoup. Pourquoi est-ce exactement qu'ils devraient être l'inverse? –

+11

Puisque vous ne pouvez hériter que d'une classe et que vous pouvez implémenter n'importe quel nombre d'interfaces, c'était probablement une chose de sucre de syntaxe. Souvenez-vous également que si votre sous-classe implémente des interfaces, cela apparaîtra également dans la liste des méthodes implémentées. Donc, les mettre dans cet ordre a un sens. – Drew

17

Oui, c'est possible. Vous avez juste besoin de conserver l'ordre correct.

class database extends mysqli implements databaseInterface { ... } 

En outre, une classe peut implémenter plus d'une interface. Séparez-les simplement par des virgules.

Cependant, je me sens obligé de vous avertir que étendre la classe mysqli est incroyablement mauvaise idée. L'héritage en soi est probablement le concept le plus surestimé et mal utilisé dans la programmation orientée objet. Au lieu de cela, je conseillerais de faire des choses liées à DB de la façon mysqli (ou manière PDO). Plus, une chose mineure, mais les conventions de nommage ont de l'importance. Votre classe database semble plus générale alors mysqli, donc il suggère que ce dernier hérite de database et non pas du chemin.

+1

Pourquoi étendre la classe mysqli est une mauvaise idée? –

+10

D'abord, parce que ce n'est pas à vous. Quand les gars de mysqli décident de changer le comportement de la sous-classe, cela change aussi. Deuxièmement, l'héritage est utilisé pour SPECIALIZE, pas pour EXTEND avec des fonctionnalités supplémentaires. C'est la chose la plus mal comprise dans OOP. En règle générale, j'ai tendance à étendre les classes abstraites seulement. –

+0

Michal - en quoi un changement de mysqli serait-il différent pour un développeur qui utilise une approche polymorphe par rapport à une approche agrégée/composée? Vous devrez toujours mettre à jour votre code pour gérer les modifications. –

3

oui, en fait, si vous souhaitez implémenter plusieurs interfaces que vous pouvez faire comme ceci:

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

} 
Questions connexes