如果你可以使用接口和特性,为什么PHP有抽象类?

19 php abstract-class interface traits

今天早些时候,我正在研究PHP的抽象类,接口特性.

据我所知,一个抽象类说"任何使用我的东西都将使用这些方法和属性",接口说"任何使用我的东西都必须有这些方法和属性",并且特征说"任何使用我的东西也会有这些方法"和属性".

现在,我的问题是,如果在使用接口和特征时获得等效的抽象类,为什么还有抽象类?

如果我错了,界面和特征不等同于抽象类,你能解释一下为什么不是这样吗?

sak*_*zai 35

我认为在如何以及何时使用它们方面存在一些哲学上的差异.

你说 :

  1. 抽象类:"使用我的任何东西将使用这些方法和属性"
  2. 接口:"使用我的任何东西必须具有这些方法和属性"
  3. 特征:"任何使用我的东西都会有这些方法和属性".

如果你专注于你自己的措辞,这是有道理的.

抽象类是在现实中定义的东西都是抽象的如汽车是一个抽象的东西,直到或者除非其物化在汽车或自行车的形式.接口既不定义它也不定义特征.

接口补充了类继承功能,其中一个类继承自多个类(只有某些语言提供多重继承,例如C/C++).接口,如名称所示,侧重于INTERFACE,而不是实现它的类中接口方法的实现.它使类PLUG&PLAYABLE所以每个人都应该遵循标准.如果您在OOP上进一步了解工厂和适配器模式,您将理解它.

特征具有未绑定到特定类的实现/功能.相反,它可以在不同的类中找到.它就像遗传基因一样,在父母身上保持沉默,只出现在某些孩子身上.或者是简洁的选择性继承,但不限于单个类.因此它提供了一种更好的代码重用方式

编辑 接口+特性!=抽象类,因为当使用特征继承时selective,您选择要使用的特定特征,而使用Abstract Class继承是强制性的或由父类决定,您没有自由!


due*_*lsy 13

这有点像说浮点数是否存在,为什么存在整数,它们都有自己的特定用途,但更重要的是看看PHP的历史将会对此有所了解:

PHP最初是在没有任何支持的情况下构建的,并且多年来越来越多地添加了PHP以扩展PHP的功能,因为我们进一步推动它(并且有争议的游戏赶上其他基于OOP的语言)

PHP 5.0

2004年 - 介绍了抽象类和接口

PHP 5.4

2012年 - 引入了特征

那是一个8年的休息时间,在那个时候需要增加对实现接口的支持,因此特性诞生了