はじめに
PHP8 では、クラスの抽象化として インターフェイス と 抽象クラス を同時に使うことができます。
これにより、複数の契約(インターフェイス)と基本設計(抽象クラス)を組み合わせて、柔軟かつ安全なクラス設計が可能になります。
この記事では、実際のコード例を通して、実行結果や挙動をわかりやすく解説します。
目次
インターフェイスと抽象クラスの混在
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() | ← 抽象メソッド
+-----------------+
図のポイント
- インターフェイスは契約のみを定義
- 抽象クラスは基本設計を提供
- 実装クラスは両方の要求を満たす必要がある
__METHOD__
で実装クラスを確認できる
まとめ
- インターフェイスと抽象クラスは混在可能。
- すべての抽象メソッドを実装すれば、クラスは正常に動作。
__METHOD__
で実装クラス名を確認できるので、挙動を把握しやすい。
このパターンは PHP8 上級試験でも出題される可能性があるので、覚えておくと安心です。