2017-06-06 56 views
1

最近我遇到了多篇文章,暗示使用Traits来覆盖接口的实现。 例子:使用Traits来涵盖接口的实现要求

interface ArticleInterface 
{ 
    /** 
    * @return mixed 
    */ 
    public function getTitle(); 
} 

trait ArticleTrait 
{ 
    /** 
    * @return string 
    */ 
    public function getTitle() 
    { 
     return "article_title"; 
    } 
} 

abstract class AbstractArticle implements ArticleInterface 
{ 
    use ArticleTrait; 
} 

Some甚至认为实现接口的特点应该是PHP提供的核心。

因此,如果应该遵循这种设计模式,我试图在问题上得到正确的回答。 如果是的话,应该将PHPDoc描述写入界面还是特性(意味着它将被复制)? 使用此设计时应注意的其他细节?

+0

Imo,特征是这种情况的不错选择:提供一些没有“真正”继承的默认实现。简单的方法来减少样板代码。这看起来像Java中的[接口的默认方法](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。我没有看到这种设计的任何缺点。 – Timurib

回答

3

特征提供编译器辅助的复制和粘贴。它们是代码重用的一种形式。虽然类继承可以让代码垂直重用(子类共享父代中定义的代码),但特性会让代码水平重用:接口共享类可以使用特征中定义的代码。

所以,是的,如果你有多个姐弟共享相同的接口执行,那么你可以使用特性来减少代码的重复。但是,不,如果只有一个类实现了一个接口 - 就像在你的例子中那样 - 然后特性增加了不应该的复杂性。

我想补充一点:特质本身不存储状态。性状中的任何成员变量将最终存储在消耗特质的对象中。如果你有一些状态信息应该被认为是“私人的”特性(因此在对象中不可用),那么不要使用特征来重新使用。相反,使用服务代表。

+0

那么PHPDocs呢?它是否应该在界面和特质? – user2816626

+0

是的,因为特质和界面目前是独立的。如果特质曾经实现过接口,那么单一源代码文档就会有意义。 – bishop