PHPにおけるOOPのインターフェース
既にご存知の通り、抽象クラスはその子孫クラスのためのメソッドのセットを表します。 これらのメソッドの一部はクラス自体で実装されることがあり、また一部のメソッドは抽象として宣言され、子孫クラスでの実装を要求することができます。
抽象クラスが実装されたメソッドを一切持たず、抽象パブリックメソッドのセットのみで構成されている状況を想像してみてください。
事実上、親クラスは子孫のインターフェース、つまり実装が必須なパブリックメソッドのセットを記述していることになります。
これがなぜ必要か:プログラミング時にエラーを減らすためです。必要なメソッドをすべて親クラスで記述しておけば、すべての子孫クラスがそれらを確実に実装することを保証できます。
これが役立つ場面:親クラスとそのいくつかの子孫クラスを作成したとします。 その後、例えば1か月後、さらにもう一つ子孫クラスを作成しようと決めた場合、私たちはコードの詳細を忘れてしまい、新しい子孫クラスにいくつかのメソッドの実装を書くのを忘れる可能性が十分にあります。 しかし、PHP自体がメソッドを失うことを許さず、単純にエラーを出力します。
同じことが、あなたのプロジェクトに関わる他のプログラマーにも当てはまります。 親クラスのコードをあなたが書き、その後あなたの同僚がもう一つ子孫クラスを作成しようと決めたとしましょう。 あなたの同僚も、いくつかのメソッドを失うことはできません。
しかし、問題があります:事実上、私たちは抽象パブリックメソッドを書くために親クラスを作成しましたが、 私たち自身や同僚が、誤ってこのクラスに非パブリックメソッドや非抽象メソッドを追加する可能性があります。
親クラスで、抽象パブリックメソッド以外のメソッドを作成することを物理的に禁止したいとします。 PHPでは、このために抽象クラスの代わりにインターフェースを使用できます。
インターフェースは、すべてのメソッドがパブリックで実装を持たないクラスです。 メソッドのコードは、インターフェースを実装するクラスによって実装される必要があります。
インターフェースは、通常のクラスと同様に宣言されますが、classの代わりにキーワードinterfaceを使用します。
インターフェースからの継承には、少し異なる用語が使われます:クラスはインターフェースを実装すると言い、継承するとは言いません。
したがって、extendsの代わりにキーワードimplementsを使用する必要があります。
インターフェースのオブジェクトを作成することはできません。
インターフェースのすべてのメソッドはpublicとして宣言され、実装を持つことはできません。
インターフェースはメソッドのみを持つことができ、プロパティを持つことはできません。
また、同じ名前のインターフェースとクラスを作成することもできません。