2009-03-16 14 views
81

Czy klasa może rozszerzyć zarówno interfejs, jak i inną klasę w PHP?
Zasadniczo chcę, aby to zrobić:Czy klasa może rozszerzyć obie klasy i implementować interfejs?

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

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

Jak można by to zrobić, po prostu robi:

class database implements databaseInterface extends mysqli{ 

wyniki w fatalnym błędzie:

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

Jak zbyt zlokalizowanych jest to ?! "To pytanie raczej nie pomoże przyszłym odwiedzającym". Jednak najlepsza odpowiedź ma 33 upvotes i pytanie 4 gwiazdki! –

Odpowiedz

138

spróbować to w drugą stronę około:

class database extends mysqli implements databaseInterface { ...} 

To powinno zadziałać.

+0

Ahh, dziękuję bardzo. Dlaczego właściwie to oni powinni być na odwrót? –

+11

Ponieważ możesz odziedziczyć tylko jedną klasę i możesz wdrożyć dowolną liczbę interfejsów, prawdopodobnie był to cukier składniowy. Pamiętaj też, jeśli twoja podklasa implementuje jakiekolwiek interfejsy, które pojawią się na liście zaimplementowanych metod. Więc umieszczenie ich w tej kolejności ma jakiś sens. – Drew

17

Tak, może. Musisz tylko zachować prawidłową kolejność.

class database extends mysqli implements databaseInterface { ... } 

Co więcej, klasa może implementować więcej niż jeden interfejs. Po prostu oddzielaj je przecinkami.

Jednak czuję się zobowiązany, aby ostrzec Cię, że rozszerzenie klasy mysqli o numer jest bardzo złym pomysłem:. Dziedziczenie per se jest prawdopodobnie najbardziej przereklamowaną i nadużywaną koncepcją programowania obiektowego.

Zamiast tego radziłbym robić rzeczy związane z db w sposób mysqli (lub sposób PDO).

Co więcej, drobiazg, ale konwencje nazewnictwa mają znaczenie. Twoja klasa database wydaje się bardziej ogólna niż mysqli, dlatego sugeruje, że ta ostatnia dziedziczy po database, a nie na odwrót.

+1

Dlaczego rozszerzenie klasy mysqli jest złym pomysłem? –

+10

Po pierwsze, ponieważ nie jest twój. Kiedy mysqli faceci decydują się na zmianę zachowania podklasy coś również się zmieni. Po drugie, dziedziczenie jest używane do SPECJALIZACJI, a nie EXTEND z dodatkową funkcjonalnością. Jest to najbardziej niezrozumiana rzecz w OOP. Z reguły mam tendencję do rozszerzania wyłącznie klas abstrakcyjnych. –

+0

Michał - jak zmiana w mysqli byłaby inna dla programisty stosującego podejście polimorficzne w stosunku do zagregowanej/złożonej? Nadal będziesz musiał zaktualizować swój kod, aby obsłużyć zmiany. –

3

tak w rzeczywistości, jeśli chcesz zaimplementować wiele interfejsów można zrobić tak:

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

} 
Powiązane problemy