読み込み中...

PHPインターフェースの使い方と応用例5選

PHPインターフェースの使い方と応用例を示すイラスト PHP
この記事は約6分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めばPHPのインターフェースについて学び、その使い方と応用例を理解することができます。

これにより、より効率的かつ堅牢なコードを書く能力が身につきます。

●PHPとは

PHPは、ウェブアプリケーション開発によく用いられるプログラミング言語です。

その特徴は、手軽さと強力さのバランスにあります。しかし、この力を最大限に引き出すには、その機能と設計原理を理解することが必要です。

その中でも、「インターフェース」は重要な概念の一つです。

●インターフェースとは

○インターフェースの基本

インターフェースとは、あるクラスが持つべきメソッドを定義するための仕組みです。

これにより、特定のクラスが必ず特定のメソッドを実装することを強制することができます。

●インターフェースの使い方

インターフェースを使うには、まずその定義を行います。

そして、そのインターフェースを実装するクラスを作成します。

○サンプルコード1:基本的なインターフェースの作成と利用

ここでは、動物を表すインターフェースを作成し、それを実装する犬と猫のクラスを作成する例を紹介します。

// 動物インターフェース
interface Animal {
    public function speak();
}

// 犬クラス
class Dog implements Animal {
    public function speak() {
        echo "ワンワン\n";
    }
}

// 猫クラス
class Cat implements Animal {
    public function speak() {
        echo "ニャーニャー\n";
    }
}

このコードでは、Animalというインターフェースを定義しています。

そして、DogとCatというクラスを作成し、それぞれがAnimalインターフェースを実装しています。

これにより、DogとCatは必ずspeakメソッドを持つことが保証されます。

○サンプルコード2:インターフェースを使ったクラスの設計

次に、インターフェースを使ったクラス設計の例を見てみましょう。

// 飛べるインターフェース
interface Flyable {
    public function fly();
}

// 鳥クラス
class Bird implements Animal, Flyable {
    public function speak() {
        echo "ピーピー\n";
    }

    public function fly() {
        echo "空を飛びます\n";
    }
}

ここでは、BirdクラスがAnimalインターフェースと、新しく作ったFlyableインターフェースを実装しています。

これにより、Birdクラスはspeakメソッドとflyメソッドの両方を持つことが保証されます。

●インターフェースの応用例

では、さらにインターフェースを活用する例をいくつか見てみましょう。

○サンプルコード3:複数のインターフェースの実装

クラスは複数のインターフェースを実装することができます。

// 泳げるインターフェース
interface Swimmable {
    public function swim();
}

// ペンギンクラス
class Penguin implements Animal, Flyable, Swimmable {
    public function speak() {
        echo "ペンペン\n";
    }

    public function fly() {
        echo "飛べません\n";
    }

    public function swim() {
        echo "水を泳ぎます\n";
    }
}

このコードでは、PenguinクラスがAnimal、Flyable、Swimmableの3つのインターフェースを実装しています。

これにより、ペンギンクラスはspeak、fly、swimの3つのメソッドを持つことが保証されます。

この例では、一つのクラスが複数のインターフェースを実装し、その結果、多機能なクラスを作成することが可能となっています。

○サンプルコード4:抽象クラスとインターフェースの組み合わせ

次に、抽象クラスとインターフェースを組み合わせた例を見てみましょう。

abstract class AbstractAnimal implements Animal {
    public function eat() {
        echo "食事をします\n";
    }
}

class Lion extends AbstractAnimal {
    public function speak() {
        echo "ガオー\n";
    }
}

このコードでは、抽象クラスAbstractAnimalがAnimalインターフェースを実装し、その中でeatメソッドを実装しています。

そして、LionクラスはこのAbstractAnimalを継承し、speakメソッドを実装しています。

この例では、共通の機能を抽象クラスに持たせ、具体的な動作を子クラスが持つという設計が行われています。

○サンプルコード5:インターフェースを使った依存性の注入

最後に、インターフェースを使った依存性の注入の例を見てみましょう。

class PetOwner {
    private $pet;

    public function __construct(Animal $pet) {
        $this->pet = $pet;
    }

    public function myPetSpeak() {
        $this->pet->speak();
    }
}

$dog = new Dog();
$owner = new PetOwner($dog);
$owner->myPetSpeak(); // ワンワン

このコードでは、PetOwnerクラスのコンストラクタでAnimalインターフェースを受け取り、そのインターフェースを実装したオブジェクトをプロパティに設定しています。

この例では、依存性の注入を行い、PetOwnerクラスが具体的なクラスに依存せずにコードを書くことができるようになっています。

●注意点と対処法

インターフェースを活用する際の注意点として、インターフェースで定義された全てのメソッドが必ず実装される必要があります。

これを怠るとエラーが生じるため、インターフェースを実装するクラスを設計する際は十分注意しましょう。

また、1つのクラスが複数のインターフェースを実装する場合、異なるインターフェースで同一のメソッド名が存在すると問題が生じる可能性があります。

同名のメソッドがそれぞれのインターフェースで定義されている場合、どちらのインターフェースのメソッドを実装するべきかが曖昧になってしまいます。

これを解決するためには、インターフェースを設計する段階で、メソッド名が重複しないように注意することが必要です。

また、必要に応じてインターフェースを分割し、一つのインターフェースが持つ責任を小さく保つという原則(インターフェース分割の原則)を適用することも有効な解決策となります。

まとめ

インターフェースは、クラスが持つべきメソッドを規定するための強力なツールです。

インターフェースを使うことで、クラスの設計がより明確になり、異なるクラスが共通の動作を持つことを保証することができます。

この記事を適切に活用してお役立て下さい。