このシリーズでは、PHP オブジェクト指向プログラミング (OOP) の基礎について説明します。コンテンツは連続したパートに編成され、それぞれが特定のトピックに焦点を当てます。初心者または OOP の概念に慣れていない場合、このシリーズは段階的にガイドできるように設計されています。 このパートでは、PHP の抽象化とインターフェースについて説明します。一緒に PHP OOP を学ぶ旅を始めましょう!
オブジェクト指向プログラミングでは、抽象化が重要な概念であることはわかっています。では、抽象化とは何でしょうか?抽象化とは、プログラムの実装の詳細を隠し、その機能のみを示すことを指します。
それでは、PHP で抽象化がどのように機能するかを理解してみましょう。まず、親クラスがあり、1 つ以上の子クラスがこの親クラスを継承する簡単な例を見ていきます。その後、このアプローチの欠点について説明します。
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
ここでは、Vehicle クラスが Car クラスと Bike クラスに継承されていることがわかります。その結果、これらのクラスは両方とも、Vehicle クラスに存在するメソッドにアクセスできるようになります。ただし、問題があります。親クラスのメソッドにはその実装が付属しており、子クラスはその実装を継承します。これは、すべての子クラスが共通の実装を共有し、同じように動作することを意味します。しかし、車の動作はバイクの動作とは異なるはずなので、これは当てはまりません。ただし、親クラスからメソッドを継承しているため、両方のクラスは同じように動作します。
では、これらの共通メソッドを継承した後、クラスごとに異なる動作をさせたい場合はどうすればよいでしょうか?
この問題を解決するために、PHP は Abstract クラスを提供します。抽象クラスとは何ですか?
抽象クラスは、抽象メソッドと非抽象メソッドの両方を持つことができるクラスのタイプです。では、抽象メソッドと非抽象メソッドとは何でしょうか?
抽象メソッドは、定義のみを持ち実装を持たないメソッドです。その結果、子クラスが親クラスを継承する場合、親クラスの抽象メソッドの実装を提供する必要があります。
非抽象メソッドは、親クラスに定義と実装の両方を持つメソッドです。子クラスはこれらのメソッドを継承するだけで使用できます。
ここで、Abstract クラスを使用して上記の問題を解決してみます。
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
ここでは、Vehicle という名前のクラスがあることがわかります。クラスを抽象化したい場合は、クラス名の前にabstractキーワードを使用する必要があります。したがって、Vehicle クラスは抽象クラスです。同様に、抽象クラスでメソッドを作成する場合は、メソッド名の前に abstract キーワードを使用する必要があります。クラスのメンバーを抽象クラスにしたい場合、そのクラスも抽象クラスでなければならないことに注意することが重要です。
Vehicle クラスから継承された抽象メソッドは、各子クラスで異なる方法で実装されました。その結果、これらのメソッドは異なる動作をし、子クラスごとに異なる結果が得られます。
ここで、メソッド getBaseFare と getPerKiloFare を子クラスに直接実装するだけで済むのに、なぜ親クラスでメソッド getBaseFare と getPerKiloFare を抽象化しなければならなかったのか疑問に思うかもしれません。
よく注意して見ると、親クラスで getBaseFare メソッドと getPerKiloFare メソッドが別のメソッド内で使用されていることがわかります。しかし、getBaseFare と getPerKiloFare を抽象化せず、子クラスにのみ実装していたら、親クラスではそれらにアクセスできなかったでしょう。したがって、親クラスと子クラスの両方からアクセスする必要があり、子クラスごとに動作が異なる必要があるメソッドは抽象化されます。
抽象クラスは直接インスタンス化できないことに注意することが重要です。代わりに、子クラスを通じてアクセスされ、抽象クラスから継承された抽象メソッドは子クラスに実装する必要があります。これを行わないと、子クラスでは何も機能しません。これにより、抽象クラスの使用方法をよりよく理解できると幸いです。
前の議論では、抽象クラスについて話しました。そのことから、抽象クラスから抽象メソッドを継承する場合、それらのメソッドは子クラスに実装する必要があることがわかりました。そうしないと、子クラスは何も機能しません。
しかし、子クラスで抽象メソッドの 1 つが必要ないにもかかわらず、実装する必要がある場合はどうなるでしょうか?これは良い解決策とは言えません。では、この場合はどうすればよいでしょうか?
この状況では、インターフェースを使用できます。インターフェイスは抽象クラスに似ていますが、ご存知のとおり、抽象クラスは抽象メンバーと非抽象メンバーの両方を持つことができるため、抽象クラスは完全に抽象ではありません。
一方、インターフェースは抽象メンバーのみを持つことができます。その結果、インターフェイスは完全な抽象クラスとみなされます。ここで、インターフェースを使用して上記の問題を解決してみます。
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
このインターフェイスには、getHourlyRate 関数の宣言が表示されます。次に、Car クラスで、このインターフェイスを使用 (実装または継承) し、インターフェイス内に抽象メソッドの実装を提供します。ただし、Bike クラスではインターフェイスを使用 (実装または継承) しなかったため、このメソッドを実装する必要はありませんでした。しかし、この抽象メソッドが抽象クラス内にあった場合、たとえ不要であっても、このメソッドを両方の子クラスに実装する必要があり、結果的に悪い設計になっていたでしょう。さらに、インターフェイスには他にもさまざまな使用例があります。
このエピソードで、議論されているトピックについての基本的な理解が得られたことを願っています。今日はここまでです。次のレッスンでもう一度話します。
GitHub や Linkedin で私とつながることができます。
以上がPHP OOP の部分抽象化とインターフェイスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。