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();
?>