2012-07-17 99 views
11

我不知道是否有任何好的理由,为什么这种行为可能在当前的PHP 5.4的实现:PHP 5.4:为什么类可以用不同的签名覆盖特征方法?

trait T { 
    public function test(PDO $pdo) {} 
} 

class C { 
    use T; 
    public function test(DOMDocument $dom) {} 
} 

我认为这是一类使用特性,保证这个类有一个具体的事实界面可用。但在这里,如果我们无意中为了另一个目的而忽略特质方法,我们甚至没有像经典继承那样收到严格标准通知。

这是特意允许的吗?做什么的?

回答

26

此行为已记录。从php.net(http://php.net/manual/en/language.oop5.traits.php):

的继承从基类构件通过由特质插入的构件 覆盖。优先顺序是来自 当前类的成员重写Trait方法,该方法在返回时覆盖 继承的方法。

没有理由在这里通知。

编辑:

我花了一些比较严重的文学一看就阐明这一主题:)一些轻。看起来这种行为是特质定义的一部分。他们正在以这种方式工作。这是从研究“特征:行为的可组合的单元”(面向对象程序设计欧洲会议论文集):

特质组成的另一个特性是组成顺序是 无关,因此相互冲突的特质方法必须明确地 消歧(参见3.5节)。在 定义的方法之间的冲突由纳入的特征定义的类和方法使用以下两个优先规则来解决: 。

- 类方法优先于特征方法。

- 特征方法优先于超类方法。这来自于稳定属性,它表明特征方法的行为就好像它们在类中定义一样。

你可以在这里阅读更多:http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf

+0

谢谢您的回答,它确实说的类可以覆盖特征的方法,但并没有说为什么可以用不同的签名重写它! – Benjamin 2012-07-17 16:16:28

+0

我更新了我的帖子。 – Eugene 2012-07-18 14:55:08

+0

据我所知,PHP中的特征覆盖方法与继承的方式相同,即没有签名检查,只有方法名称。 – Timur 2012-07-18 15:00:59

相关问题