php - PHP 中 Trait 和抽象类的区别

标签 php abstract-class traits

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

An interface defines a set of methods that the implementing class must implement.

When a trait is use'd the implementations of the methods come along too--which doesn't happen in an Interface.

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

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

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

最佳答案

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

  • 在每个类中使用代码冗余单独实现它
  • 从通用(抽象)祖先类继承

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

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

关于php - PHP 中 Trait 和抽象类的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39466521/

相关文章:

Java - 抽象类、equals() 和两个子类

rust - 为什么将函数移至默认特征方法会导致借入错误?

PHP、MSSQL、SQL SERVER、WAMP、PDO、Windows 身份验证

javascript - 如何在ckeditor中自定义工具并显示自定义工具

php - 在 PHP 或 Node.js 中读取编码错误的 JSON 文件

php - Zend 中的查询联合不同

java - 在java中,内部类可以继承内部类外部类之外定义的抽象类吗?

c# - 两个相关继承层次结构的OOAD(游戏组件)

rust - 为数值类型创建类型别名时关联类型不明确

generics - 为两步从创建通用的“从/到”快捷方式