web-dev-qa-db-ja.com

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

クラスは、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 *に '{'が必要です
89
Pim Jager

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

class database extends mysqli implements databaseInterface { ...}

これは動作するはずです。

157
Simon Lehmann

はい、できます。正しい順序を維持する必要があります。

class database extends mysqli implements databaseInterface { ... }

さらに、クラスは複数のインターフェイスを実装できます。それらをカンマで区切るだけです。

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

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

さらに、些細なことですが、命名規則は重要です。あなたのクラスdatabasemysqliよりも一般的であるため、後者はdatabaseから継承し、方法を継承しないことを示唆しています。

17

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

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

}
3
nullpointer