使用Traits来涵盖Interfaces的实现要求

时间:2017-06-06 15:03:16

标签: php oop traits composition

最近我遇到了多篇暗示使用Traits来涵盖Interfaces实现的文章。 例如:

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核心中提供实现接口的Traits。

因此,如果应该遵循这种设计模式,我试图对问题做出正确的回答? 如果是,PHPDoc描述是否应该在接口和特征中写入(意味着它将被复制)? 使用此设计时我应该注意的任何其他细节?

1 个答案:

答案 0 :(得分:3)

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

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

我想补充一点:特质本身并不存储状态。特征中的任何成员变量最终将存储在消耗特征的对象中。如果您有某些状态信息应该被视为特征的“私有”(因此在对象中不可用),则不要使用特征进行重用。相反,请使用服务代表。