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能够找出其中一个覆盖另一个?我无法找到有关此限制in the manual的任何内容。
This related question提到了一种解决问题的方法(通过对特征方法使用别名),但不是首先引起它的原因。
在这种情况下,我收到了一条不同的错误消息:*“特征方法__construct尚未应用,因为在A上存在与其他特征方法的冲突”*。另外,如果导入的方法是构造函数,则没有区别。该问题中的示例可以很好地与其他方法一起工作,只有构造函数的行为不同。 – Zilk
@hakre但不解释,为什么不同的方法似乎工作得很好。可以? – SteAp
@Zilk:该错误命名不同,因为* extends *步骤缺失,但这两个错误都告诉您有关碰撞。对于其他*方法,请尝试其他*魔术方法。我可以想象那些人会有一些不同,因为你不能混淆他们。他们依赖于他们的名字不能改变,所以没有别名,所以没有冲突的资源,所以只是一个碰撞。 – hakre