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

时间:2014-01-01 05:59:15

标签: php interface abstract-class traits

今天早些时候,我正在研究PHP的abstract classesinterfacestraits

据我所知,一个抽象类说“任何使用我的东西都会使用这些方法和属性”,界面说“任何使用我的东西都必须有这些方法和属性”,而且特征说“任何使用我的东西也会有这些方法和属性“。

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

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

3 个答案:

答案 0 :(得分:34)

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

你说:

  1. 抽象类:“使用我的任何东西使用这些方法 和属性“
  2. 接口:“使用我的任何东西必须这些方法和属性”
  3. 特质:“使用我的任何东西也会拥有这些方法和属性”。
  4. 如果你专注于你自己的措辞,这是有道理的。

    抽象类实际上定义了抽象的内容,例如,除非具体化形式为汽车或自行车。界面既不定义它也不定义特征。

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

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

    修改 Interface + Trait!=抽象类,因为在使用Trait继承时selective选择要使用的特定特征,而使用Abstract Class继承是强制性的或由父类决定,你没有自由!

答案 1 :(得分:14)

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

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

PHP 5.0

2004 - 引入抽象类和接口

PHP 5.4

2012年 - 介绍了特征

这是一个8年的休息时间,在那段时间内需要增加对interfaces with implementations的支持,因此这个特性诞生了

答案 2 :(得分:1)

当你使用traits时,你只需要一个给定的类来实现一些方法。

您不会继承任何属性或方法,也不会强制该对象进入任何继承树。

因此,您可以使用相同的特征来拥有几个完全不相关的类,只是为了保证这些类的任何对象都支持给定的方法。

这就是PHP如何着名的Mixins。 基本上,Mixin只是一个可以与其他几个类共享共同特征的类。 Traits允许对类的方法强制执行该约束,而与这些类是否相互继承的方式无关。

当你想要一个类来组合两个父母的行为时,你可以使用特征来获得相同的结果,而不必麻烦一些不必要的其他事情。<\ n>而不是必须做多次继承到愚蠢的点。 / p>