特征的构造函数定义如何冲突?

时间:2013-08-27 22:55:43

标签: php oop constructor traits

在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不应该弄清楚其中一个会覆盖另一个吗?我无法找到有关此限制的任何内容in the manual

This related question提到了解决问题的方法(通过使用特征方法的别名),但不是首先引起它的原因。

1 个答案:

答案 0 :(得分:3)

尝试使用以下代码:

class A {
    use T;
    use T;
}

因为这是你通过从A扩展然后再次使用T为B而实际编写的内容。

如果需要在基类和子类中使用特征T,请仅在基类中使用它。

如果仅在子类中需要它,请仅在叶子类中使用它。