我最近在PHP中遇到了Traits,我试图了解它们。在我的研究期间,我偶然发现了这个Stack Overflow问题:Traits vs. Interfaces。接受的答案提到了以下内容:
接口定义了实现类必须的一组方法 实施
当使用特征时,方法的实现就会出现 也是 - 在接口中没有发生。
到目前为止一切都很好,但这听起来就像接口和抽象类之间的区别。所以这为我提出了一个后续问题:
我知道我只能从一个抽象类扩展,另一方面可以使用任何数量的特征。但这真的是唯一的区别吗?我仍然不完全了解特征及其用途。
答案 0 :(得分:32)
Traits允许您在类之间共享代码,而不会强迫您进入特定的类层次结构。假设您希望所有类都具有方便的实用方法foo($bar)
;没有特质,你有两个选择:
两种解决方案都不理想,每种解决方案都有不同的权衡。代码冗余显然是不可取的,并且继承自共同的祖先会使您的类层次结构设计不灵活。
Traits通过让您在每个类可以单独“导入”的特征中实现foo($bar)
来解决此问题,同时仍然允许您根据业务逻辑要求设计类层次结构,而不是语言必需品。
答案 1 :(得分:5)
不完全......让我们为此目的引用官方文档:
特质与类相似,但仅用于分组 功能细化和一致的方式。这不可能 自己实例化Trait。它是传统的补充 继承并实现行为的横向组合;那是, 类成员的应用程序,无需继承。
因此,Traits用于合成目的,以使类能够执行某些逻辑/行为。如果您从另一个/抽象类继承,它通常是出于多态的目的,并且您获得了一个独特的继承/类层次结构,这可能是也可能不是。
我认为这一切都取决于背景,架构以及你想要做什么。