《PHP8上級試験対策》無名クラスとトレイトの利用可否

  • URLをコピーしました!

はじめに

PHP8 上級試験で「無名クラス(Anonymous Class)」について問われることがあります。
その中で「無名クラスではトレイトが使えない」という説明を見かけることがありますが、これは 誤り です。

キーワード: 無名クラス / trait / __toString / 継承 / インターフェイス

目次

無名クラスの基本

無名クラスはその場限りの一時的なクラスで、インスタンスを直接生成できます。

$obj = new class {
    public function hello() {
        return "Hello from anonymous class!";
    }
};
echo $obj->hello();

出力:

Hello from anonymous class!

誤答パターン:「無名クラスはトレイトを使えない」

問題集などでは、以下のように書かれていることがあります。

trait ToString {
    public function __toString(): string {
        return "num is {$this->num}, str is {$this->str}\n";
    }
}

$obj = new class(1, '2nd') {
    use ToString;
    public function __construct(
        private int $num,
        private string $str,
    ) {}
};

echo $obj;

誤答解説では:

Fatal error: Anonymous classes cannot use traits

と説明される場合がありますが、これは 間違い です。

正しい動作

実際に PHP8 で動かすと、以下のように 正常に動作します

num is 1, str is 2nd

図解:無名クラスの関係性

+-------------------------------+
|          無名クラス             |
|  - 名前がないだけ               |
|  - 通常のクラスと同等の機能       |
|                               |
|   +-----------------------+   |
|   |   トレイト (ToString)  |   |
|   +-----------------------+   |
|   |   メソッド注入OK!      |   |
+-------------------------------+

まとめ

  • ✅ 無名クラスは通常のクラスとほぼ同じ機能を持つ
  • ✅ コンストラクタやマジックメソッドは利用可能
  • ✅ トレイトの使用も可能(問題集の記述は誤り)
  • ✅ 継承やインターフェイス実装も可能

試験対策ポイント

  • 「無名クラスは使い捨てのクラス」=機能が制限されるわけではない
  • 「トレイトが使えない」といった説明は 誤答パターン
  • 本試験では「通常クラスと同様に trait / 継承 / インターフェイスが使える」が正解

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

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