php中abstract类和接口的区别

本文主要讨论php中abstract类和接口的区别。下边所有讨论都针对php代码来说。
【讨论地址】

在实际代码开发中,很多人经常会觉得抽象类和接口很类似。抽象类和接口都没有实现具体的方法,抽象类被继承后,在子类中对方法进行了具体的实现,接口也是类似。那么二者有什么区别呢。

抽象类

概念

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。在编程语言中抽象类通常用abstract关键字来修饰

特征

  • 类名用abstract 关键字修饰
  • 抽象类是类的一种,需要被继承
  • 必须包含至少一个抽象方法,抽象方法没有方法体
  • 抽象类不能实例化
  • 子类必须定义抽象类中的所有抽象方法

接口

概念

(自己总结)面向对象中的接口指的是一种特殊的数据结构,使用interface关键字修饰,他说明了类需要实现的所有方法,但并不实现它们

特征

  • interface关键字修饰,
  • 具体的类使用implements关键字和他建立联系
  • 不能被实例化
  • 所有的方法都没有具体实现,只是一种声明(宣称自己有哪些方法)
  • 所有的方法必须是共有的public

对比

相同点

  • 都是上层的抽象层,都是对一种类的抽象
  • 都不能被实例化
  • 都包含了不用实现的方法
  • 抽象方法和接口方法的参数可以和子类方法参数不一致,子类的不一致参数需要有默认值;

区别

  • 抽象类需要被继承,使用extends关键字,在子类中实现抽象方法;接口需要被类实现,使用implements关键字
  • 抽象类中可以实现方法、声明方法;接口只做方法的声明
  • 抽象类的方法可以是public和protected;接口的方法只能是public
  • 一个类只能继承一个抽象类;但可以实现多个接口
  • 抽象类中可以有静态方法,但是抽象方法不能是静态的;接口中不能有静态方法
  • 抽象类中的成员变量可以是各种类型的;而接口中不能有变量(php);
  • 接口中常量不能被重载。

参考文献

  1. 接口和抽象类有什么区别
  2. 深入理解Java的接口和抽象类
  3. 抽象类和接口联系与区别
  4. 对象接口
  5. 抽象类