複数インターフェースの実装
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 29/91。
継承とは異なり、class は1つの親クラスしか拡張できませんが、PHPではclassが複数のinterfacesをimplementできます。これにより、異なる契約を組み合わせる柔軟性が得られ、クラスをより汎用的にできます。
複数のインターフェースを実装するには、implementsキーワードの後でインターフェースをコンマで区切ります。
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
出力:
Printing: Sales Report
Saving: Sales ReportReport クラスは、Printable と Savable のすべての methods を実装することで、both の契約を満たします。各 interface で宣言されているすべての method に対して、実装を提供する必要があります。
このアプローチは、単一継承の制約なしに複数の要件を満たすクラスを構築できるため強力です。クラスは、印刷可能、保存可能、エクスポート可能など、複数の性質を同時に備えることができます。
重要なポイント: 複数のinterfacesを実装するにはカンマを使用します。classは、実装するすべてのinterfaceに含まれるすべてのmethodsの具体的な実装を提供する必要があります。
チャレンジ
簡単単一のクラスが複数のインターフェースを実装し、異なる機能を得る方法を示すメディアファイルシステムを構築しましょう。
再生と共有の両方ができるメディアファイルを処理するために連携する4つのファイルを作成します。
Playable.php:単一のメソッドシグネチャplay()を持つPlayableinterface をDefineします。この契約により、再生可能なメディアを開始できます。Shareable.php:単一のメソッドシグネチャshare($platform)を持つShareableinterface をDefineします。この契約により、共有可能なコンテンツを異なるプラットフォームに配信できます。Video.php:PlayableとShareableのbothをimplementsするVideoclassをCreateします。先頭で両方のinterface filesをIncludeします。classにはprivateな$titlepropertyと、privateな$durationproperty(minutes単位)が必要です。constructorはtitleとdurationをacceptsします。play()をImplementして"Playing video: [title] ([duration] min)"をreturnします。share($platform)をImplementして"Sharing [title] on [platform]"をreturnします。main.php:Video fileをIncludeします。3つのinputs、つまりvideo title、duration(integerに変換するstringとして)、platform nameを受け取ります。titleとdurationを使ってVideoobjectをCreateします。最初のlineでplay()をcallingしたresultをPrintし、次に2番目のlineでplatformを使ってshare()をcallingしたresultをPrintします。
あなたの Video classは、2つの別々の契約を同時に満たします。あらゆるメディアと同様に再生でき、ソーシャルプラットフォームで共有できます。これが複数のinterfaceをImplementする力です。単一のclassが、単一の継承チェーンに制限されることなく、異なるソースから機能を獲得できます。
自分で試してみよう
<?php
// Videoファイルをインクルード
require_once 'Video.php';
// 入力を読み取る
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: titleとdurationでVideoオブジェクトを作成する
// TODO: 1行目にplay()を呼び出した結果を出力する
// TODO: 2行目にplatformを指定してshare()を呼び出した結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ