2009-03-16 5 views
81

Kann eine Klasse sowohl eine Schnittstelle als auch eine andere Klasse in PHP erweitern?
Grundsätzlich möchte ich dies tun:Kann eine Klasse sowohl eine Klasse erweitern als auch ein Interface implementieren?

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

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

Wie würde man das tun, einfach tun:

class database implements databaseInterface extends mysqli{ 

führt zu einem fatalen Fehler:

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

Wie ist das zu lokalisierter ?! "Diese Frage wird wahrscheinlich zukünftigen Besuchern nicht helfen". Aber die beste Antwort hat 33 Upvotes und die Frage 4 Sterne! –

Antwort

138

es in die andere Richtung probieren um:

class database extends mysqli implements databaseInterface { ...} 

Das sollte funktionieren.

+0

Ahh, vielen Dank. Warum genau sollten sie andersherum sein? –

+11

Da Sie nur eine Klasse erben können und Sie können eine beliebige Anzahl von Schnittstellen implementieren, war es wahrscheinlich eine Syntax Zucker Sache. Denken Sie auch daran, wenn Ihre Unterklasse Schnittstellen implementiert, die auch in der Liste der implementierten Methoden angezeigt werden. Es ist also sinnvoll, sie in diese Reihenfolge zu bringen. – Drew

17

Ja kann es. Sie müssen nur die richtige Reihenfolge beibehalten.

class database extends mysqli implements databaseInterface { ... } 

Darüber hinaus kann eine Klasse mehr als eine Schnittstelle implementieren. Trenne sie einfach mit Kommas.

Allerdings fühle ich mich verpflichtet, Sie zu warnen, dass erweitern mysqli Klasse ist unglaublich schlechte Idee. Die Vererbung an sich ist wahrscheinlich das am meisten überbewertete und missbrauchte Konzept in der objektorientierten Programmierung.

Stattdessen würde ich empfehlen, db-related stuff den mysqli Weg (oder PDO Weg).

Plus, eine Nebensache, aber Namenskonventionen sind wichtig. Ihre Klasse database scheint allgemeiner als mysqli, daher schlägt sie vor, dass letztere von database erbt und nicht den Weg herum.

+1

Warum ist die mysqli-Klasse eine schlechte Idee? –

+10

Erstens, weil es nicht deins ist. Wenn mysqli Jungs sich entscheiden, etwas zu ändern, ändert sich auch das Verhalten der Unterklasse. Zweitens wird Vererbung verwendet, um SPEZIALISIEREN, nicht EXTEND mit zusätzlicher Funktionalität. Dies ist das am meisten missverstandene Ding in OOP. Als Faustregel tendiere ich dazu, nur abstrakte Klassen zu erweitern. –

+0

Michal - wie würde ein Wechsel zu mysqli für einen Entwickler, der einen polymorphen Ansatz gegenüber einem aggregierten/zusammengesetzten verwendet, anders aussehen? Sie müssen Ihren Code immer noch aktualisieren, um mit den Änderungen fertig zu werden. –

3

ja, in der Tat wollen, wenn Sie mehrere Schnittstellen implementieren Sie so tun können:

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

} 
Verwandte Themen