PHP 5.4.9 では、次の例は致命的なエラー「B にはトレイトからのコンストラクター定義が衝突しています」がトリガーされます。
trait T {
public function __construct () {
echo __CLASS__ . ": constructor called.\n";
}
}
class A {
use T;
}
class B extends A {
use T;
}
トレイトにコンストラクターとは異なるメソッドが含まれていても問題はなく、コンストラクターが実際にクラスにコピーされていても問題ありません (トレイトを使用せずに、「言語支援のコピー & ペースト」機能を使用します)。
ここでのコンストラクターの何が特別なのですか? PHP は、それらのうちの 1 つが他のものをオーバーライドすることを理解できるべきではありませんか? マニュアルには、この制限について何も見つかりませんでした。
この関連する質問は、問題を回避する方法について言及しています (特性メソッドのエイリアスを使用することにより) が、そもそも何が原因であるかについては言及していません。