Php 使用Traits覆盖接口的实现需求

Php 使用Traits覆盖接口的实现需求,php,oop,traits,composition,Php,Oop,Traits,Composition,最近我看到了多篇文章,这些文章暗示要使用Traits来涵盖接口的实现。 例如: interface ArticleInterface { /** * @return mixed */ public function getTitle(); } trait ArticleTrait { /** * @return string */ public function getTitle() { return

最近我看到了多篇文章,这些文章暗示要使用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;
}
甚至认为实现接口的特性应该在PHP核心中可用

因此,我试图在一个问题上得到一个恰当的回答,即是否应该遵循这种设计模式? 如果是,PHPDoc描述是否应同时以接口和特征形式编写(意味着它将被复制)?
使用此设计时我应该注意的任何其他细节?

Traits提供了编译器辅助的复制和粘贴。它们是代码重用的一种形式。类继承允许代码在垂直方向重复使用(子类共享其父类中定义的代码),而trait允许代码在水平方向重复使用:接口共享类可以使用trait中定义的代码

因此,是的,如果您有多个同级共享相同的接口和实现,那么您可以使用traits来减少代码重复。但是,如果您只有一个类实现一个接口(如您的示例中所示),那么特性会增加不应有的复杂性


我想补充一点:特质本身并不储存状态。trait中的任何成员变量最终都将存储在使用trait的对象中。如果您有一些状态信息应该被认为是特性的“私有”信息(因此在对象中不可用),那么不要将特性用于重复使用。相反,使用服务委托。

Imo,对于这种情况,Traits是一个不错的选择:提供一个没有“真正”继承的默认实现。简化样板代码的简单方法。这在Java中看起来很像。我看不出这种设计有任何缺点。那么PHPDOC呢?它应该同时存在于接口和特性中吗?是的,因为特性和接口目前是独立的。如果traits实现了接口,那么单源文档就有意义了。