ITHACK
~ みんなのIT部門 ~

【PHP】インターフェース(interface) – クラスに実装(implements)するメソッドの定義

PHPにはインターフェース(interface)と呼ばれる仕組みがあります。
インターフェースはクラスで実装する必要があるメソッドを定義し、クラスと合わせて使います。

ここではインターフェースについて解説します。

  • インターフェース(interface)

  • インターフェースの実装(implements)

インターフェースとは

インターフェースはクラスに実装するメソッドを定義したものです。
クラスと合わせて使い、インターフェースをクラスに適用することを「インターフェースを実装する」と呼びます。

メリットやデメリットを理解しようとすると設計やオブジェクト指向の知識が必要になりますが、先ずはプログラミングでの動作と使い方について覚えていきましょう。

基本構文

インターフェースは定義と実装の主に2つの基本構文があります。

定義

interface インターフェース名 {
    アクセス修飾子 function メソッド名( $引数名 );
}

インターフェースには抽象メソッドのみ定義できます。
抽象メソッドの定義はabstractを付ける必要はなく、interfaceの中のメソッドは自動的に抽象メソッドになります。

実装

class クラス名 implements インターフェース名 {
}

クラスの定義でクラス名に続いてimplements インターフェース名を記述することでインターフェースを実装するクラスを作成できます。

サンプルコード

インターフェースを使ったサンプルコードをご覧ください。

<?php

interface Communication {
    
    public function profile();
    
}

class Person implements Communication {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "名前: ".$this->name."\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();

?>
名前: Watanabe You

CommunicationインターフェースをPersonクラスに実装するコードです。

各コードの概要は次の通りです。

行数 概要
3~7 Communicationインターフェースを定義。
9~21 Personクラス(Communicationインターフェースを実装)を定義。
23 Personクラスのインスタンスを生成し、$watanabeに代入。
24 $watanabeのprofileメソッドを呼び出し。

Communicationインターフェースの定義では、抽象メソッドであるprofileメソッドを定義しています。

これにより、Communicationインターフェースを実装したPersonクラスではprofileメソッドを必ず実装する必要があります。

なお、抽象クラスに実装した場合は抽象メソッドの実装は必須ではありません。

複数のインターフェース

1つのクラスに対して、複数のインターフェースを実装することができます。
次のサンプルコードをご覧ください。

<?php

interface Communication {
    
    public function profile();
    
}

interface Calculation {
    
    public function addition( $x, $y );
    
}


class Person implements Communication, Calculation {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "名前: ".$this->name."\n";
    }
    
    public function addition( $x, $y ) {
        $total = $x + $y;
        echo $x." + ".$y." = ".$total."\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();
$watanabe->addition(3, 5);

?>
名前: Watanabe You
3 + 5 = 8

先ほどのサンプルコードにCalculationインターフェースを追加し、Personクラスで実装しています。
インターフェースを複数実装する場合は、16行目のようにインターフェースをカンマ(,)区切りで記述します。

これにより、Personクラスではprofileとadditionの2つのメソッドを実装する必要があります。

演習問題

問題1

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 下記表のクラス・インターフェースを作成する
  • 実行結果になるように各クラスのインスタンスを使う
種類 名前 英記 継承元 インターフェース フィールド メソッド
インターフェース チケット情報 TicketInfo info()
抽象クラス チケットクラス
Ticket TicketInfo $price(料金)
具象クラス ライブチケット LiveTicket Ticket $place(場所) info()
→ 場所と料金を出力
具象クラス ライブ配信チケット LiveStreamingTicket Ticket $url(URL) info()
→ URLと料金を出力
===== ライブチケット =====
料金 : 8000円
場所 : ライブハウス
===== ライブ配信   =====
料金 : 3000円
URL : https://it-hack.net/live-streaming

問題2

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 下記表のクラス・インターフェースを作成する
  • 実行結果になるように各クラスのインスタンスを使う
種類 名前 英記 継承元 インターフェース フィールド メソッド
インターフェース 車機能 CarMethod ・display_distance()
・run_distance()
・run()
抽象クラス 車クラス
Car なし CarMethod $distance(移動距離)
※ 初期値は0
$acceleration(加速度)
※ 初期値は60
display_distance()
→ $distanceの値を出力
run()
→ run_distance()で前進距離を取得し出力する。また、$distanceに前進距離を加算
具象クラス スポーツカークラス SportCar Car なし run_distance()
→ 前進距離を計算
→ 計算式は$acceleration * 1.2
具象クラス ファミリーカークラス FamilyCar Car なし run_distance()
→ 前進距離を計算
→ 計算式は$acceleration * 0.8
===== スポーツカー  =====
72km進みます。
72km進みます。
移動距離 : 144km
===== ファミリーカー =====
48km進みます。
48km進みます。
移動距離 : 96km

まとめ

インターフェースはクラスに実装するメソッドを定義する仕組みです。
インターフェースの理解には設計等の知識も必要になってきますが、先ずはプログラミングでどのような動作をするかを覚えていきましょう。