クラスや trait 、Enum から use use 先へコピペされたよう振る舞う 直接インスタンスを作れない 複数 trait を同時に use できる 型宣言に使えない trait T { // トレイトの定義 public string $property = self::class; public function method(): void { echo $this->property, PHP_EOL; } } class C { use T; // トレイトの利用 }
中心の部品構成でも一応可能 interface 側と trait 側で同じシグネチャを記述するようなこ とが起きがち 特定の interface を実装していることの要求をできるクラス とくらべるとやや弱い trait T1 { abstract public function f1(): void; public function f2(): void { f1(); } } trait T2 { use T1; public function f1(): void { echo 'T2';} } trait T3 { use T1; public function f1(): void { echo 'T3';} }
これより class C1 { use FunctionalityTrait1; use FunctionalityTrait2; } // クラスの DI にするほうが楽 class C2 { public function __construct( private FunctionalityClass1 $functionality1, private FunctionalityClass2 $functionality2, ) { } }
trait なら小分けに分割できる class P { public function common_function(): void {} // A 、 B にのみ必要な機能が C 、 D にも導入 public function ab_function(): void {} // C 、 D にのみ必要な機能が A 、 B にも導入 public function cd_function(): void {} } class A extends P {} class B extends P {} class C extends P {} class D extends P {}