PHP - クラス - インターフェース

公開日:2020-12-22 更新日:2020-12-22
[PHP]

1. 概要

インターフェースは、メソッドのメソッド名、引数、戻り値だけを定義したものです。
メソッドの処理は定義しません。
抽象メソッドだけを定義したものと考えても良いです。
インターフェースは、クラスに指定することができ、
指定されたクラスは、インターフェースが持つメソッドを実装する必要があります。

これにより、各クラスの処理内容が異なっても、同じインターフェースを持っているクラスのオブジェクトであれば、利用者は同じように扱うことができます。
例えば自動車の場合、車種(クラス)が異なると、性能(処理内容)が異なりますが、
利用者は、車の使い方(インターフェース)だけ知っていれば、どんな車種の車でも運転することができるのと同じです。

インターフェースは次のように定義します。
インターフェースのメソッドは、public にする必要があります。
他の言語では、省略することが多いです。あえて public と付けると、エラーになる場合もあります。
interface インターフェース名 {
    function メソッド名1(引数1, 引数2, ... 引数n);
    function メソッド名2(引数1, 引数2, ... 引数n);
    function メソッド名3(引数1, 引数2, ... 引数n);
}
クラスにインターフェースを指定する場合は、implements を使います。
class クラス名 implements インターフェース名 {
    public function メソッド名1(引数1, 引数2, ... 引数n) {
        処理;
    }
    public function メソッド名2(引数1, 引数2, ... 引数n) {
        処理;
    }
    public function メソッド名3(引数1, 引数2, ... 引数n) {
        処理;
    }
}

クラスは、インターフェースを複数持つことができます。
class クラス implements 子インターフェース1, 子インターフェース2 { }

インターフェースは、インターフェースから継承することもできます。
interface 親インターフェース { }
interface 子インターフェース extends 親インターフェース { }

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

2. 使用例

加算クラス(Add)と減算クラス(Substract)は、 ICalc と言うインターフェースを実装しているため、
利用者は calc() と言うメソッドで、クラスを意識せずに計算を行うことができます。

interface ICalc {
    function calc($v1, $v2);
}

class Add implements ICalc {
    public function calc($v1, $v2) {
        return $v1 + $v2;
    }
}

class Substract implements ICalc {
    public function calc($v1, $v2) {
        return $v1 - $v2;
    }
}

$objAdd = new Add();
var_dump( $objAdd->calc(3, 5) ); // 8

$objSub = new Substract();
var_dump( $objSub->calc(3, 5) ); // -2
実行結果
int(8)
int(-2)