はじめに
PHP8 上級試験で「無名クラス(Anonymous Class)」について問われることがあります。
その中で「無名クラスではトレイトが使えない」という説明を見かけることがありますが、これは 誤り です。
目次
無名クラスの基本
無名クラスはその場限りの一時的なクラスで、インスタンスを直接生成できます。
$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 / 継承 / インターフェイスが使える」が正解