在 PHP 5.4.9 中,以下示例触发了 fatal error “B has colliding constructor definitions coming from traits”。
trait T {
public function __construct () {
echo __CLASS__ . ": constructor called.\n";
}
}
class A {
use T;
}
class B extends A {
use T;
}
当 trait 包含与构造函数不同的方法时没有问题,当构造函数实际复制到类中时也没有问题(不使用 traits,即“语言辅助复制和粘贴”功能)。
这里的构造函数有什么特别之处? PHP 不应该能够弄清楚其中一个覆盖另一个吗?我找不到关于此限制的任何信息 in the manual .
This related question提到了一种解决问题的方法(通过为特征方法使用别名),但没有首先提到导致问题的原因。
最佳答案
尝试使用以下代码会发生什么:
class A {
use T;
use T;
}
因为这是您通过从 A 扩展然后再次使用 T 为 B 有效编写的内容。
如果您需要在基类和子类中使用特征 T,请仅在基类中使用它。
如果您只在子类中需要它,请只在叶子类中使用它。
关于php - 特征中的构造函数定义如何冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476798/