《PHP8上級試験対策》インターフェイスと抽象クラスを同時に使うときの挙動

  • URLをコピーしました!

はじめに

PHP8 では、クラスの抽象化として インターフェイス抽象クラス を同時に使うことができます。
これにより、複数の契約(インターフェイス)と基本設計(抽象クラス)を組み合わせて、柔軟かつ安全なクラス設計が可能になります。
この記事では、実際のコード例を通して、実行結果や挙動をわかりやすく解説します。

キーワード: インターフェイス / 抽象クラス / implements / extends

目次

インターフェイスと抽象クラスの混在

PHP8 では以下のように インターフェイスと抽象クラスを同時に使うことが可能 です。

interface HogeInterface {
    public function test();
}

abstract class Foo {
    abstract public function test2();
}
  • HogeInterface は「public 抽象メソッド」のみを宣言可能。
  • Foo は抽象クラスで、具体的な実装は持たず抽象メソッド test2() を定義。

実装クラスの定義

class Bar extends Foo implements HogeInterface {
    public function test() {
        echo __METHOD__ , "\n";
    }

    public function test2() {
        echo __METHOD__ , "\n";
    }
}
  • Bar はインターフェイスの test() と抽象クラスの test2() の両方を 必ず実装 しています。
  • これにより、PHP はエラーを出さず正しく動作します。

実行と出力

$obj = new Bar();
$obj->test();   // 出力: Bar::test
$obj->test2();  // 出力: Bar::test2
  • __METHOD__ は「定義されたクラス::メソッド名」を返します。
  • したがって、結果は Bar::test / Bar::test2 となります。

図解:インターフェイスと抽象クラスの関係

       +-----------------+
       | HogeInterface   |  ← インターフェイス
       |-----------------|
       | + test()        |  ← public 抽象メソッド
       +-----------------+
                 ^
                 |
       +-----------------+
       |      Bar        |  ← 実装クラス
       |-----------------|
       | + test()        |  ← HogeInterface の実装
       | + test2()       |  ← Foo の実装
       +-----------------+
                 ^
                 |
       +-----------------+
       |      Foo        |  ← 抽象クラス
       |-----------------|
       | + test2()       |  ← 抽象メソッド
       +-----------------+

図のポイント

  1. インターフェイスは契約のみを定義
  2. 抽象クラスは基本設計を提供
  3. 実装クラスは両方の要求を満たす必要がある
  4. __METHOD__ で実装クラスを確認できる

まとめ

  • インターフェイスと抽象クラスは混在可能。
  • すべての抽象メソッドを実装すれば、クラスは正常に動作。
  • __METHOD__ で実装クラス名を確認できるので、挙動を把握しやすい。

このパターンは PHP8 上級試験でも出題される可能性があるので、覚えておくと安心です。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次