第10章 オブジェクト指向構文 / 第2回 模擬試験
PHPのトレイト(Trait)に関する次の記述のうち、正しいものはどれか。
トレイトは`use`キーワードでクラス内に取り込むことができる。
正解
トレイトはインスタンス化して直接使用することができる。
トレイトは複数のクラスから同時に継承する手段として使われ、継承と同じ制約を持つ。
1つのクラスに複数のトレイトを取り込むことはできない。
解説
トレイトは、クラス定義の内部で`use TraitName;`と書くことで、そのトレイトが持つメソッドやプロパティをクラスに取り込める、コード再利用のための仕組みです。
他の選択肢が誤りである理由は次の通りです。
・トレイトは単体でインスタンス化することはできません。必ずいずれかのクラスに取り込んで、そのクラス経由で使います。
・トレイトは「継承」とは異なる仕組みです。PHPのクラス継承は単一継承のみですが、トレイトは1つのクラスに複数取り込むことができ、継承関係のような制約を持ちません。
・1つのクラスに`use TraitA, TraitB;`のように、カンマ区切りで複数のトレイトを同時に取り込むことができます。
例:
```
trait Loggable {
public function log(string $msg): void { echo "[LOG] {$msg}"; }
}
trait Cacheable {
public function cacheKey(): string { return static::class; }
}
class Service {
use Loggable, Cacheable;
}
```
(参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.5節 トレイト p.523〜531)