最近我遇到了多篇暗示使用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描述是否应该在接口和特征中写入(意味着它将被复制)? 使用此设计时我应该注意的任何其他细节?
答案 0 :(得分:3)
Traits提供编译器辅助的复制和粘贴。它们是代码重用的一种形式。虽然类继承为您提供了垂直重用的代码(子类共享在其父级中定义的代码),但是traits可以让您在代码中重复使用代码:接口共享类可以使用在特征中定义的代码。
所以,是的,如果您有多个兄弟姐妹共享相同的接口和实现,那么您可以使用特征来减少代码重复。但是,不,如果你只有一个类实现一个接口 - 就像在你的例子中那样 - 那么traits会增加不应该的复杂性。
我想补充一点:特质本身并不存储状态。特征中的任何成员变量最终将存储在消耗特征的对象中。如果您有某些状态信息应该被视为特征的“私有”(因此在对象中不可用),则不要使用特征进行重用。相反,请使用服务代表。