インターフェース入門
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 27/91。
インターフェースは、クラスが従わなければならない契約を定義します。抽象メソッドと具象メソッドの両方を含むことができる抽象クラスとは異なり、インターフェースは実装を持たず、メソッドのシグネチャのみを宣言します。それを約束と考えてください。インターフェースを実装するクラスは、それらの特定のメソッドを提供することを保証します。
インターフェースを定義するには、interfaceキーワードを使用します:
<?php
interface Printable {
public function print();
}
このインターフェースは、Printableを実装するすべてのクラスがprint()メソッドを持つ必要があることを宣言しています。インターフェースはメソッドがどのように動作するかは気にせず、単にそれが存在することだけを要求します。
基本的な構造を示す簡単な例を以下に示します。
<?php
interface Drivable {
public function start();
public function stop();
}
インターフェースのメソッドはボディ(本体)を持たず、セミコロンで終わるシグネチャのみを持つことに注意してください。インターフェース内のすべてのメソッドは暗黙的に public であるため、private や protected を使用することはできません。
インターフェースは、無関係なクラスが共通の動作を共有できるようにするため、強力です。Car と Motorcycle は継承関係においては何の共通点もないかもしれませんが、両方が Drivable を実装することで、start() メソッドと stop() メソッドを持つことを保証できます。
重要なポイント: インターフェースは、クラスが持つべきメソッドを定義するものであり、それらがどのように動作すべきかを定義するものではありません。これは、実装クラスが満たさなければならない契約を確立します。
チャレンジ
簡単インターフェースについて学ぶための、シンプルなメッセージングシステムを構築しましょう。メッセージがどのように処理されるべきかという規約(コントラクト)を定めるインターフェースを定義し、次のレッスンで作成する実装クラスの基礎を築きます。
コードは2つのファイルに分けて構成します:
Messageable.php—Messageableという名前のインターフェースを定義し、2つのメソッドシグネチャを宣言します。メッセージを作成するためのcompose($content)と、それを送信するためのdeliver()です。インターフェースのメソッドには本体(body)がなく、シグネチャの最後をセミコロンで終えることを忘れないでください。main.php— Messageable ファイルを読み込みます。インターフェースが正しく定義されているか確認するために、PHPのinterface_exists()関数を使用してMessageableが存在するかチェックします。次に、ReflectionClassを使用してインターフェースを検査し、そのメソッドをリストアップします。インターフェースのリフレクションを作成し、getMethods()を使用してメソッドを取得し、各メソッド名をそれぞれの行に出力してください。
出力には、インターフェースで宣言した2つのメソッド名を、定義した順にそれぞれの行に表示する必要があります。
このチャレンジでは、将来のクラスが満たすべき規約であるインターフェースの定義のみに焦点を当てます。それらがどのように機能するかを心配することなく、どのようなメソッドが存在しなければならないかを確立します。その実装については次のレッスンで行います!
チートシート
インターフェースは、クラスが従わなければならない規約(コントラクト)を定義します。実装を持たず、メソッドのシグネチャのみを宣言します。
interfaceキーワードを使用してインターフェースを定義します:
<?php
interface Printable {
public function print();
}
インターフェースのメソッドには本体がなく、セミコロンで終わるシグネチャのみを記述します。インターフェース内のすべてのメソッドは、暗黙的にpublicとなります。
<?php
interface Drivable {
public function start();
public function stop();
}
インターフェースを使用すると、特定のメソッドの実装を保証することで、関連のないクラス間で共通の動作を共有できるようになります。
自分で試してみよう
<?php
// Messageableインターフェースファイルをインクルードします
require_once 'Messageable.php';
// TODO: interface_exists() を使用して Messageable インターフェースが存在するかどうかを確認します
// TODO: Messageable インターフェースの ReflectionClass オブジェクトを作成します
// TODO: getMethods() を使用してメソッドを取得します
// TODO: メソッドをループして、各メソッド名をそれぞれの行に出力します
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。