PHP 5.4:为什么类可以用不同的签名覆盖trait方法


PHP 5.4: why can classes override trait methods with a different signature?

我想知道在当前的PHP 5.4实现中,这种行为是否有充分的理由:

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

我认为,一个类使用了一个特性,这一事实保证了这个类有一个特定的可用接口。但在这里,如果我们无意中出于另一个目的重写trait方法,我们甚至不会像经典继承那样收到"严格标准"通知。

这是故意允许的吗?为何

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

从基类继承的成员被成员重写由Trait插入。优先顺序是当前类重写Trait方法,返回重写继承的方法。

这里没有通知的理由。

编辑:

我看了一些更严肃的文献,对这个话题有了一些了解:)。看起来这样的行为是特征定义的一部分。他们必须这样工作。这来自研究";特征:可组合的行为单位;(面向对象编程欧洲会议论文集):

特质构成的另一个特性是,构成顺序是不相关的,因此冲突的特征方法必须明确消除歧义(参见第3.5节)通过合并特征定义的类和方法使用以下两条优先规则。

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

–特性方法优先于超类方法。这源于fleattening属性,该属性指出特征方法的行为就像它们在类本身中定义的一样。

您可以在此处阅读更多信息:http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf