PHP 5.4:为什么类覆盖了不同的签名特征的方法呢?(PHP 5.4: why can class

2019-07-30 11:22发布

我不知道是否有任何好的理由,为什么这种行为可能在当前的PHP 5.4的实现:

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

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

我认为这是一类使用性状的事实,保证这个类有一个特定的接口使用。 但在这里,如果我们无意中覆盖特征方法用于其他目的,我们甚至不接受严格的标准的通知,与经典的传承。

这是特别允许的目的是什么? 做什么的?

Answer 1:

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

从基类继承的成员通过由特质插入的构件覆盖。 的优先顺序是,从当前类倍率性状的方法,其在返回倍率继承的方法的成员。

没有理由在这里通知。

编辑:

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

性状组合物的另一个特性是,该组合物顺序是无关紧要的,并且因此相互冲突的性状的方法必须被明确地消除歧义(参见第3.5节)。 精读使用以下两种优先规则方法类和方法去连接通过合并特质定义定义去网络连接解决之间的佛罗里达州信息通信技术。

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

- 特质方法优先于父类的方法。 在此之前,从压扁的财产,其中规定特征方法的行为,好像他们是在类中定义去网络连接。

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



文章来源: PHP 5.4: why can classes override trait methods with a different signature?