2013-08-27 39 views
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提到了一种解决问题的方法(通过对特征方法使用别名),但不是首先引起它的原因。

回答

3

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

class A { 
    use T; 
    use T; 
} 

,因为这是你有效地从A再次延伸,然后用T代表B.

写道如果您需要使用特质吨基类和子类,只能在基类中使用它。

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

+0

在这种情况下,我收到了一条不同的错误消息:*“特征方法__construct尚未应用,因为在A上存在与其他特征方法的冲突”*。另外,如果导入的方法是构造函数,则没有区别。该问题中的示例可以很好地与其他方法一起工作,只有构造函数的行为不同。 – Zilk

+0

@hakre但不解释,为什么不同的方法似乎工作得很好。可以? – SteAp

+0

@Zilk:该错误命名不同,因为* extends *步骤缺失,但这两个错误都告诉您有关碰撞。对于其他*方法,请尝试其他*魔术方法。我可以想象那些人会有一些不同,因为你不能混淆他们。他们依赖于他们的名字不能改变,所以没有别名,所以没有冲突的资源,所以只是一个碰撞。 – hakre