PHP 中 Trait 和抽象类之间的区别

2022-08-30 10:11:29

我最近在PHP中遇到了Traits,我试图理解它们。在我的研究中,我偶然发现了这个堆栈溢出问题:特征与接口。被接受的答案提到以下内容:

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

当使用特征时,方法的实现也会出现 - 这在接口中不会发生。

到目前为止,一切都很好,但对我来说,这听起来完全像是接口和抽象类之间的区别。因此,这为我提出了一个后续问题:

  • PHP中的特质类和抽象类有什么区别?

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


答案 1

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

  • 通过每个类中的代码冗余单独实现它
  • 从公共(抽象)祖先类继承

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

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


答案 2

不完全是。。。为此,让我们引用官方文档:

Trait 类似于类,但仅用于以细粒度和一致的方式对功能进行分组。无法自行实例化 Trait。它是传统继承的补充,可以水平组合行为;也就是说,在不需要继承的情况下应用类成员。

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

我认为这一切都取决于上下文,架构以及你到底想做什么。


推荐