PHP中特征与抽象类的区别

时间:2016-09-13 09:25:55

标签: php abstract-class traits

我最近在PHP中遇到了Traits,我试图了解它们。在我的研究期间,我偶然发现了这个Stack Overflow问题:Traits vs. Interfaces。接受的答案提到了以下内容:

  

接口定义了实现类必须的一组方法   实施

     

当使用特征时,方法的实现就会出现   也是 - 在接口中没有发生。

到目前为止一切都很好,但这听起来就像接口和抽象类之间的区别。所以这为我提出了一个后续问题:

  • PHP中的Trait和Abstract Class有什么区别?

我知道我只能从一个抽象类扩展,另一方面可以使用任何数量的特征。但这真的是唯一的区别吗?我仍然不完全了解特征及其用途。

2 个答案:

答案 0 :(得分:32)

Traits允许您在类之间共享代码,而不会强迫您进入特定的类层次结构。假设您希望所有类都具有方便的实用方法foo($bar);没有特质,你有两个选择:

  • 在每个类中单独实现代码冗余
  • 继承自公共(抽象)祖先类

两种解决方案都不理想,每种解决方案都有不同的权衡。代码冗余显然是不可取的,并且继承自共同的祖先会使您的类层次结构设计不灵活。

Traits通过让您在每个类可以单独“导入”的特征中实现foo($bar)来解决此问题,同时仍然允许您根据业务逻辑要求设计类层次结构,而不是语言必需品。

答案 1 :(得分:5)

不完全......让我们为此目的引用官方文档:

  

特质与类相似,但仅用于分组   功能细化和一致的方式。这不可能   自己实例化Trait。它是传统的补充   继承并实现行为的横向组合;那是,   类成员的应用程序,无需继承。

因此,Traits用于合成目的,以使类能够执行某些逻辑/行为。如果您从另一个/抽象类继承,它通常是出于多态的目的,并且您获得了一个独特的继承/类层次结构,这可能是也可能不是。

我认为这一切都取决于背景,架构以及你想要做什么。