PHP アドバンス

PHP OOP - インターフェース

1. PHP インターフェース

インターフェース(Interface)を使用すると、クラスが実装しなければならないパブリックメソッドを定義できます。この際、メソッドの具体的な中身(実装内容)を記述する必要はありません。

インターフェースは interface キーワードで宣言し、そこで宣言されるすべてのメソッドは public である必要があります。

interface InterfaceName {
  public function method1();
  public function method2();
}

インターフェースを実装するには、クラスで implements キーワードを使用します。インターフェースを実装したクラスは、そのインターフェースで宣言されているすべてのメソッドを実装しなければなりません。

class ClassName implements InterfaceName {
  public function method1() { 
    // 何らかの処理
  } 
  public function method2() { 
    // 何らかの処理
  } 
}

以下の例では、1つのパブリックメソッド makeSound() を持つ Animal というインターフェースを定義しています。Cat クラスと Dog クラスは Animal インターフェースを実装しているため、どちらも makeSound() メソッドを含める必要があります。

1.1 実装例:Animal インターフェース

<?php
// インターフェースの定義
interface Animal {
  public function makeSound();
}

// クラスでインターフェースを実装
class Cat implements Animal {
  public function makeSound() {
    echo "ニャー";
  }
}

// 別のクラスでインターフェースを実装
class Dog implements Animal {
  public function makeSound() {
    echo "ワンワン";
  }
}

$cat = new Cat();
$cat->makeSound();

$dog = new Dog();
$dog->makeSound();
?>

2. インターフェース vs 抽象クラス

インターフェースは抽象クラスと似ていますが、以下のような明確な違いがあります。

機能インターフェース抽象クラス
プロパティプロパティを持つことはできないプロパティを持つことができる
メソッドの可視性すべて public である必要があるpublic または protected が可能
メソッドの実装すべて抽象メソッド(中身は書けない)実装を持つメソッドを混在させることができる
継承と実装他のクラスを継承しながら同時に実装可能1つのクラスしか継承できない

インターフェースを利用することで、多種多様なクラスを同じように扱うことが容易になります。1つ以上のクラスが同じインターフェースを使用している状態を「ポリモーフィズム(Polymorphism / 多態性)」と呼びます。

3. インターフェースの実践的な利用

以下の例では、2つのパブリックメソッド fromFamily()makeSound() を持つ Animal インターフェースを定義しています。Cat クラスと Dog クラスはこれらをすべて実装する必要があります。

<?php
interface Animal {
  public function fromFamily();
  public function makeSound();
}

class Cat implements Animal {
  public function fromFamily() {
    echo "分類: ネコ科(近縁種: ライオン、トラ、ジャガー、リンクス、クーガー、チーターなど)。<br>";
  }
  public function makeSound() {
    echo "鳴き声: ニャー。";
  }
}

class Dog implements Animal {
  public function fromFamily() {
    echo "分類: イヌ科(近縁種: オオカミ、キツネ、コヨーテ、ジャッカル、イヌなど)。<br>";
  }
  public function makeSound() {
    echo "鳴き声: ワンワン。";
  }
}

echo "<h3>猫(Cats)</h3>";
$cat = new Cat();
$cat->fromFamily();
$cat->makeSound();

echo "<h3>犬(Dogs)</h3>";
$dog = new Dog();
$dog->fromFamily();
$dog->makeSound();
?>