12

我想知道在当前的 PHP 5.4 实现中是否有任何充分的理由说明这种行为是可能的:

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

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

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

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

4

1 回答 1

29

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

从基类继承的成员被由 Trait 插入的成员覆盖。优先顺序是当前类中的成员覆盖 Trait 方法,这反过来又覆盖继承的方法。

这里没有通知的理由。

编辑:

我看了一些更严肃的文献来阐明这个话题:)。看起来这种行为是特征定义的一部分。他们被要求以这种方式工作。这是来自研究“Traits: Composable Units of Behavior”(欧洲面向对象编程会议论文集):

特征组合的另一个特性是组合顺序是不相关的,因此必须明确消除冲突的特征方法(参见第 3.5 节)。类中定义的方法与合并特征定义的方法之间的冲突使用以下两个优先规则来解决。

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

– 特征方法优先于超类方法。这源于扁平化属性,该属性表明 trait 方法的行为就像它们是在类本身中定义的一样。

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

于 2012-07-17T11:36:26.783 回答