複数インターフェースの実装
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 29/91。
クラスが1つの親しか継承できない継承とは異なり、PHPではクラスが複数のインターフェースを実装することが可能です。これにより、異なる規約を組み合わせる柔軟性が得られ、クラスの汎用性が高まります。
複数のインターフェースを実装するには、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 のすべてのメソッドを実装することで、両方のコントラクトを満たします。各インターフェースで宣言されているすべてのメソッドに対して、実装を提供する必要があります。
このアプローチは、単一継承の制約を受けることなく、複数の要件を満たすクラスを構築できるため、非常に強力です。クラスは、印刷可能、保存可能、エクスポート可能といった機能をすべて同時に備えることができます。
重要なポイント: 複数のインターフェースを実装するには、カンマを使用します。クラスは、実装するすべてのインターフェースのすべてのメソッドに対して、具体的な実装を提供する必要があります。
チャレンジ
簡単1つのクラスが複数のインターフェースを実装することで、異なる機能を獲得する方法を示すメディアファイルシステムを構築しましょう。
再生と共有の両方が可能なメディアファイルを処理するために、連携して動作する4つのファイルを作成します。
Playable.php—play()という単一のメソッドシグネチャを持つPlayableインターフェースを定義します。この規約により、再生可能なメディアはすべて開始できることが保証されます。Shareable.php—share($platform)という単一のメソッドシグネチャを持つShareableインターフェースを定義します。この規約により、共有可能なコンテンツはすべて異なるプラットフォームに配信できることが保証されます。Video.php—PlayableとShareableの両方を実装するVideoクラスを作成します。冒頭で両方のインターフェースファイルをインクルードしてください。このクラスは、プライベートな$titleプロパティとプライベートな$durationプロパティ(分単位)を持つ必要があります。コンストラクタはタイトルと演奏時間を受け取ります。play()を実装して、"Playing video: [title] ([duration] min)"を返すようにします。share($platform)を実装して、"Sharing [title] on [platform]"を返すようにします。main.php— Videoファイルをインクルードします。ビデオのタイトル、演奏時間(整数に変換するための文字列として)、およびプラットフォーム名の3つの入力を受け取ります。タイトルと演奏時間を使用してVideoオブジェクトを作成します。1行目にplay()を呼び出した結果を出力し、2行目にプラットフォームを指定してshare()を呼び出した結果を出力します。
作成する Video クラスは、2つの別々の規約を同時に満たします。つまり、あらゆるメディアと同様に再生することができ、ソーシャルプラットフォームに共有することもできます。これが複数のインターフェースを実装する力です。単一の継承チェーンに制限されることなく、1つのクラスが異なるソースから機能を獲得できるのです。
チートシート
クラスは、implementsキーワードの後にカンマで区切ることで、複数のインターフェースを実装できます。
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
public function print() {
return "Printing report";
}
public function save() {
return "Saving report";
}
}クラスは、実装するすべてのインターフェースのすべてのメソッドに対して、具体的な実装を提供しなければなりません。これにより、単一継承の制約を受けることなく、クラスが同時に複数の契約を満たすことが可能になります。
自分で試してみよう
<?php
// Videoファイルを含める
require_once 'Video.php';
// 入力を読み込む
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: タイトルと再生時間を使用してVideoオブジェクトを作成する
// TODO: 1行目にplay()を呼び出した結果を出力する
// TODO: 2行目にプラットフォームを指定してshare()を呼び出した結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。