Menu
Coddy logo textTech

インターフェースの実装

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 World

Document class は、独自の print() method を提供することで Printable を実装します。必須の method の実装を忘れると、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: $150

DocumentInvoice はどちらも Printable の契約を満たしますが、それぞれの目的に応じて異なる方法で印刷を処理します。

重要なポイント:implementsを使用してclassをinterfaceに接続し、その後、必要なすべてのメソッドを定義します。各実装classは独自のロジックを提供しながら、同じメソッドシグネチャが存在することを保証します。

challenge icon

チャレンジ

簡単

異なる class が同じ interface をそれぞれ独自の方法で implements できることを示す messaging system を構築しましょう。

異なる種類のメッセージを処理するために連携して動作する3つのファイルを作成します。

  • Messageable.php: 2つの method signature、compose($content)deliver() を持つ Messageable interface を Define します。この interface は、すべてのメッセージの種類が従う必要のある契約を確立します。
  • Email.php: Messageable を implements する Email class を Create します。先頭で interface ファイルを読み込みます。この class には private な $recipient property と private な $body property を持たせます。constructor は recipient address を受け取ります。compose($content) を Implement して content を $body に保存し、"Email composed" を返します。deliver() を Implement して "Email to [recipient]: [body]" を返します。
  • SMS.php: 同じく Messageable を implements する SMS class を Create します。先頭で interface ファイルを読み込みます。この class には private な $phoneNumber property と private な $text property を持たせます。constructor は phone number を受け取ります。compose($content) を Implement して content を $text に保存し、"SMS composed" を返します。deliver() を Implement して "SMS to [phoneNumber]: [text]" を返します。

main.php では、Email と SMS の両方のファイルを読み込みます。3つの入力として、email address、phone number、message content を受け取ります。email address を使って Email object を、phone number を使って SMS object を Create します。両方の object に対して message content を引数として compose() を Call し、それぞれの結果を独自の行に print します。続いて両方の object に対して deliver() を Call し、それぞれの結果を独自の行に print します。順序は email compose、SMS compose、email deliver、SMS deliver とします。

両方の class は同じ Messageable contract を満たしますが、それぞれが独自の目的に応じてメッセージの compose と deliver を処理します。email は recipient address を表示し、SMS メッセージは phone number を表示します。

自分で試してみよう

<?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()を呼び出し、結果を出力する
// Order: email compose, then SMS compose

// TODO: 両方のオブジェクトでdeliver()を呼び出し、結果を出力する
// 順序: email deliver、次にSMS deliver
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ