PHP中特征与抽象类的区别

sim*_*mon 30 php abstract-class traits

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

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

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

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

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

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

dec*_*eze 40

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

  • 在每个类中单独实现代码冗余
  • 从一个共同的(抽象)祖先类继承

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

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

  • 是的,完全正确.把它想象成可以用来将一个类放在一起(组合)的一点点零碎.根据代码重用性在应用程序中的重要性,您可以将所有内容实现为特征,然后将一些特征组合到各种配置的实际类中. (5认同)
  • 因此,如果我理解正确,那么基本上可以认为特征是在几个不相关的类中使用相同的代码? (3认同)
  • 你说它像帮手吗? (2认同)
  • 您还可以将它们与接口结合使用,例如在接口中定义一些方法并为实现提供特征,这样您的实现比抽象类更灵活(因为它不限于单一类型) (2认同)

wal*_*her 7

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

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

因此Traits用于组合目的,以使类能够执行某些逻辑/行为.如果你继承自另一个/抽象类,它通常是出于多态的目的,你会得到一个独特的继承/类层次结构,这可能是也可能不是.

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