我想知道在当前的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