5

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 つが他のものをオーバーライドすることを理解できるべきではありませんか? マニュアルには、この制限について何も見つかりませんでした。

この関連する質問は、問題を回避する方法について言及しています (特性メソッドのエイリアスを使用することにより) が、そもそも何が原因であるかについては言及していません。

4

1 に答える 1

3

次のコードで何が起こるか試してください。

class A {
    use T;
    use T;
}

これは、A から拡張し、T を B に再度使用することによって効果的に記述したものだからです。

基本クラスとサブクラスで特性 T を使用する必要がある場合は、基本クラスでのみ使用してください。

サブクラスでのみ必要な場合は、リーフ サブクラスでのみ使用してください。

于 2013-08-27T22:59:10.610 に答える