Menu
Coddy logo textTech

複数インターフェースの実装

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 Report

Report クラスは、PrintableSavable のすべての methods を実装することで、both の契約を満たします。各 interface で宣言されているすべての method に対して、実装を提供する必要があります。

このアプローチは、単一継承の制約なしに複数の要件を満たすクラスを構築できるため強力です。クラスは、印刷可能、保存可能、エクスポート可能など、複数の性質を同時に備えることができます。

重要なポイント: 複数のinterfacesを実装するにはカンマを使用します。classは、実装するすべてのinterfaceに含まれるすべてのmethodsの具体的な実装を提供する必要があります。

challenge icon

チャレンジ

簡単

単一のクラスが複数のインターフェースを実装し、異なる機能を得る方法を示すメディアファイルシステムを構築しましょう。

再生と共有の両方ができるメディアファイルを処理するために連携する4つのファイルを作成します。

  • Playable.php:単一のメソッドシグネチャ play() を持つ Playable interface をDefineします。この契約により、再生可能なメディアを開始できます。
  • Shareable.php:単一のメソッドシグネチャ share($platform) を持つ Shareable interface をDefineします。この契約により、共有可能なコンテンツを異なるプラットフォームに配信できます。
  • Video.phpPlayableShareable のbothをimplementsする Video classをCreateします。先頭で両方のinterface filesをIncludeします。classにはprivateな $title propertyと、privateな $duration property(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を使って Video objectを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()を呼び出した結果を出力する

?>
quiz icon腕試し

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

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

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