クラスはクラスを拡張し、インターフェースを実装できますか


100

クラスは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{ 

致命的なエラーが発生します:

解析エラー:構文エラー、予期しないT_EXTENDS、行* line *の* file *に '{'が必要です

18
これはどのようにローカライズされていますか?「この質問は、今後の訪問者を助けることはほとんどありません」。しかし、最良の回答には33の賛成票と4つの星の質問があります。
duality_ 2013

回答:


177

別の方法で試してください:

class database extends mysqli implements databaseInterface { ...}

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


ああ、どうもありがとうございました。なぜ彼らは逆でなければならないのですか?
Pim Jager、

14
継承できるクラスは1つだけで、任意の数のインターフェイスを実装できるため、おそらく構文上の問題でした。また、サブクラスがインターフェイスを実装している場合は、実装されているメソッドのリストにも表示されることに注意してください。したがって、それらをこの順序で配置することには、一定の意味があります。
ドリュー

それは悪い習慣ですか?
Mohammed Shamshid

21

はい、できます。あなただけの正しい順序を保持する必要があります。

class database extends mysqli implements databaseInterface { ... }

さらに、クラスは複数のインターフェースを実装できます。カンマで区切ってください。

ただし、mysqliクラス拡張することは非常に悪い考えであることを警告する義務があります。継承自体は、おそらくオブジェクト指向プログラミングで最も過大評価され、誤用されている概念です。

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

さらに、マイナーなことですが、命名規則は重要です。あなたのクラスdatabasemysqliそのときより一般的であるように思われるので、後者は継承するのdatabaseではなく継承することを示唆しています。


1
mysqliクラスを拡張することはなぜ悪い考えなのですか?
Pim Jager

11
まず、あなたのものではないからです。mysqliが何かを変更すると、サブクラスの動作も変更されます。第2に、継承はSPECIALIZEに使用され、追加機能によるEXTENDではありません。これは、OOPで最も誤解されていることです。経験則として、私は抽象クラスのみを拡張する傾向があります。
のMichałRudnicki

Michal-mysqliへの変更は、ポリモーフィックアプローチを使用する開発者と、集約/構成されたアプローチを使用する開発者にとって、どのような違いがありますか?変更を処理するには、コードを更新する必要があります。
Peter Bailey、

2
アダプターのパターンをよく知っています。メソッド名が変更された場合や廃止された場合でも、両方のシナリオでコードを変更する必要があると言っています。このシナリオではポリモーフィックでないアプローチの方が良いことに同意しますが、アダプターは変更に対して「免疫力がある」という概念を購入しません。
Peter Bailey、

2
アダプターコードを変更するだけでよく、そのコードを使用するすべての場所を変更する必要はありません。コンポジションでは互換性レイヤーを提供できますが、継承ではせいぜいハックと呼ぶことができます。そして、私は正直に言うと、アダプターは変更に対するより優れた耐性を提供します。
ミシャウルドニツキ2009年

6

はい、実際に複数のインターフェースを実装したい場合は、次のようにできます:

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.