2009-03-16 47 views
81

クラスは、PHPでインターフェイスと別のクラスの両方を拡張できますか?
基本的に私はこれをしたい:クラスはクラスを拡張してインターフェイスを実装できます

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

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

はどのようにしてこれを行うだろう、単純にやって:致命的なエラーで

class database implements databaseInterface extends mysqli{ 

結果:

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

を、これはあまりにもローカライズされてどのように? "この質問は将来の訪問者を助けることはまずありません"。しかし、最善の答えは33 upvotesと質問4つ星があります! –

答えて

138

はそれを他の方法を試してみてください周り:

class database extends mysqli implements databaseInterface { ...} 

これはうまくいくはずです。

+0

ああ、ありがとう。それはなぜ彼らはまったく反対の方向にすべきですか? –

+11

あなたは1つのクラスを継承することができ、任意の数のインターフェースを実装することができるので、おそらく構文砂糖のことでした。また、サブクラスがインターフェイスを実装している場合は、実装されたメソッドのリストにも表示されることに注意してください。そのような順序でそれらを置くことはある意味があります。 – Drew

17

はいできます。あなたは正しい順序を保持するだけです。

さらに、クラスは複数のインターフェイスを実装できます。コンマで区切ります。

しかし、私はの拡張mysqliクラスは信じられないほど悪い考えだと思います。継承自体はおそらく、オブジェクト指向プログラミングで最も過大評価され、誤用されている概念です。

代わりに私はmysqli(またはPDOの方法)のdb関連のものを行うことをお勧めします。

プラス、マイナーなことですが、命名規則は重要です。あなたのクラスdatabaseは、より一般的なmysqliのように見えます。したがって、後者はdatabaseから継承しています。

+1

なぜmysqliクラスを拡張するのが悪いのですか? –

+10

まず、あなたのものではないからです。 mysqliの人が何かを変えることを決めたら、サブクラスの振る舞いも変わります。次に、継承はSPECIALIZEに使用され、余分な機能では拡張されません。これはOOPで最も誤解されていることです。経験則として抽象クラスを拡張する傾向があります。 –

+0

Michal - mysqliへの変更は、多態的なアプローチと集約/作成されたアプローチを使用する開発者にとって、どのように異なるでしょうか?変更を処理するためにコードを更新する必要があります。 –

3

あなたは、このように行うことができ、複数のインターフェイスを実装する場合は、[はい、実際には:

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

} 
関連する問題