5

在 PHP 5.4.9 中,以下示例触发致命错误"B has colliding constructor definitions from traits"

trait T {
    public function __construct () {
        echo __CLASS__ . ": constructor called.\n";
    }
}

class A {
    use T;
}

class B extends A {
    use T;
}

当特征包含与构造函数不同的方法时没有问题,当构造函数实际复制到类中时没有问题(不使用特征,“语言辅助复制和粘贴”功能)。

这里的构造函数有什么特别之处?PHP 不应该能够找出其中一个覆盖另一个吗?我在手册中找不到有关此限制的任何信息。

这个相关问题提到了一种解决问题的方法(通过使用特征方法的别名),但不是首先导致它的原因。

4

1 回答 1

3

试试下面的代码会发生什么:

class A {
    use T;
    use T;
}

因为这是您通过从 A 扩展然后再次将 T 用于 B 来有效编写的内容。

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

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

于 2013-08-27T22:59:10.610 回答