インターフェースの実装
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 28/91。
インターフェースが何であるかを理解したところで、実際にそれらを実装する方法を見ていきましょう。クラスは implements キーワードを使用してインターフェースを実装し、そのインターフェースで宣言されているすべてのメソッドに対して具体的な実装を提供しなければなりません。
<?php
interface Printable {
public function print();
}
class Document implements Printable {
private $content;
public function __construct($content) {
$this->content = $content;
}
public function print() {
return "Printing: " . $this->content;
}
}
$doc = new Document("Hello World");
echo $doc->print();
出力:
Printing: Hello WorldDocumentクラスは、独自のバージョンのprint()メソッドを提供することで、Printableを実装します。必要なメソッドの実装を忘れると、PHPは致命的なエラーをスローします。
異なるクラスが、同じインターフェースを独自の方法で実装することができます。
<?php
class Invoice implements Printable {
private $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function print() {
return "Invoice Total: $" . $this->amount;
}
}
$invoice = new Invoice(150);
echo $invoice->print();
出力:
Invoice Total: $150DocumentとInvoiceの両方がPrintableコントラクトを満たしていますが、それぞれがその目的に基づいて異なる方法で印刷を処理します。
重要なポイント: implements を使用してクラスをインターフェースに接続し、次にすべての必要なメソッドを定義します。各実装クラスは、同じメソッドシグネチャが存在することを保証しながら、独自のロジックを提供します。
チャレンジ
簡単異なるクラスが同じインターフェースを独自の方法で実装する方法を示すメッセージングシステムを構築しましょう。
異なる種類のメッセージを処理するために、連携して動作する3つのファイルを作成します。
Messageable.php—compose($content)とdeliver()という2つのメソッドシグネチャを持つMessageableインターフェースを定義します。このインターフェースは、すべてのメッセージタイプが従わなければならない規約を確立します。Email.php—Messageableを実装するEmailクラスを作成します。ファイルの先頭でインターフェースファイルをインクルードしてください。このクラスは、プライベートな$recipientプロパティとプライベートな$bodyプロパティを持つ必要があります。コンストラクタは受信者アドレスを受け取ります。compose($content)を実装して、コンテンツを$bodyに保存し、"Email composed"を返します。deliver()を実装して、"Email to [recipient]: [body]"を返します。SMS.php— 同じくMessageableを実装するSMSクラスを作成します。ファイルの先頭でインターフェースファイルをインクルードしてください。このクラスは、プライベートな$phoneNumberプロパティとプライベートな$textプロパティを持つ必要があります。コンストラクタは電話番号を受け取ります。compose($content)を実装して、コンテンツを$textに保存し、"SMS composed"を返します。deliver()を実装して、"SMS to [phoneNumber]: [text]"を返します。
main.php では、EmailとSMSの両方のファイルをインクルードします。メールアドレス、電話番号、メッセージ内容の3つの入力を受け取ります。メールアドレスを使用して Email オブジェクトを作成し、電話番号を使用して SMS オブジェクトを作成します。両方のオブジェクトでメッセージ内容を引数にして compose() を呼び出し、それぞれの結果を個別の行に出力します。次に、両方のオブジェクトで deliver() を呼び出し、それぞれの結果を個別の行に出力します。順序は、email compose、SMS compose、email deliver、SMS deliverとする必要があります。
両方のクラスは同じ Messageable 規約を満たしていますが、それぞれが独自の目的に応じてメッセージの作成と配信を処理します。メールは受信者アドレスを表示し、SMSメッセージは電話番号を表示します。
チートシート
クラスは implements キーワードを使用してインターフェースを実装し、そのインターフェースで宣言されているすべてのメソッドに対して具体的な実装を提供する必要があります。
<?php
interface Printable {
public function print();
}
class Document implements Printable {
private $content;
public function __construct($content) {
$this->content = $content;
}
public function print() {
return "Printing: " . $this->content;
}
}
複数のクラスが同じインターフェースを実装でき、それぞれが独自の実装を提供します。
<?php
class Invoice implements Printable {
private $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function print() {
return "Invoice Total: $" . $this->amount;
}
}
クラスがインターフェースで要求されるすべてのメソッドを実装していない場合、PHPは致命的なエラー(fatal error)をスローします。
自分で試してみよう
<?php
require_once 'Email.php';
require_once 'SMS.php';
// 入力を読み込む
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));
// TODO: メールアドレスを使用してEmailオブジェクトを作成する
// TODO: 電話番号を使用してSMSオブジェクトを作成する
// TODO: 両方のオブジェクトでcompose()を呼び出し、結果を出力する
// 順序: emailのcompose、次にSMSのcompose
// TODO: 両方のオブジェクトでdeliver()を呼び出し、結果を出力する
// 順序: emailのdeliver、次にSMSのdeliver
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。