インターフェース入門
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 27/91。
interface は、クラスが従うべき契約を定義します。抽象クラスには抽象 methods と具象 methods の両方を含めることができるのとは異なり、interface は実装を持たずに method シグネチャのみを宣言します。interface を実装するクラスは、指定されたそれらの methods を必ず提供する、という約束だと考えてください。
インターフェースはinterfaceキーワードを使用して定義します。
<?php
interface Printable {
public function print();
}
このinterfaceは、Printableを実装するすべてのクラスがprint()というmethodを持つ必要があることを宣言します。interfaceはそのmethodがどのように動作するかには関知せず、ただそれがexistsすることだけを求めます。
基本的な構造を示す簡単な例を見てみましょう。
<?php
interface Drivable {
public function start();
public function stop();
}
interface methods には body がなく、just semicolon で ending するシグネチャだけであることに注意してください。interface のすべての methods は暗黙的に public なので、private や protected は使用できません。
インターフェースは、互いに関係のないクラス同士が共通の振る舞いを共有できるため強力です。CarとMotorcycleは継承という点では共通するものが何もhaveないかもしれませんが、どちらもDrivableを実装することで、start()とstop()のmethodsを持つことを保証できます。
要点: interface は、class がどの methods を have すべきかを定義するものであり、それらがどのように動作すべきかを定義するものではありません。これは、実装する class が満たさなければならない契約を確立します。
チャレンジ
簡単インターフェースについて学ぶために、シンプルなメッセージングシステムを構築しましょう。メッセージをどのように処理すべきかの契約を定めるインターフェースを Define し、次のレッスンで作成する実装クラスの基盤を構築します。
コードを2つのファイルに整理します。
Messageable.php:Messageablecalled インターフェースを Define し、2つの method シグネチャを宣言します。メッセージを creating するためのcompose($content)と、メッセージを deliver するためのdeliver()です。Remember、interface の method には body がなく、semicolon で ending するシグネチャだけがあります。main.php: Messageable ファイルを Include します。interface が正しく定義されていることを確認するには、PHP のinterface_exists()function を使用してMessageableが exists するか check します。次にReflectionClassを使用して interface を調べ、その methods を一覧表示します。interface の reflection を作成し、getMethods()(ReflectionMethodobjects を返します)を使用して methods を取得し、各 method のgetName()をそれぞれ独自の line に print します。
出力には、interface が宣言する2つの method 名が、それぞれ別の line に、Define した順序で表示されるはずです。
この challenge は、interface の Define のみに焦点を当てています。つまり、将来のクラスが満たす必要のある契約です。どの method が存在 should するかを定めるものであり、それらがどのように動作するかを心配する必要はありません。その実装は次のレッスンで扱います!
自分で試してみよう
<?php
// Messageableインターフェースファイルをインクルードする
require_once 'Messageable.php';
// TODO: interface_exists()を使用してMessageableインターフェースが存在するか確認する
// TODO: MessageableインターフェースのReflectionClassオブジェクトを作成する
// TODO: getMethods()を使用してメソッドを取得する
// TODO: メソッドをループして各メソッド名を1行ずつ出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ