细说PHP面向对象abstract与interface的区别
一、抽象类 abstract class
1)抽象类定义:class前添加abstract关键字且存在抽象方法的类为抽象类。
【举例】
class Person{
public function getName();
}
2)抽象类不能被直接实例化。抽象类中只定义子类所需要实现的方法。子类继承抽象类后必须实现抽象类中所定义的所有抽象方法。
3)抽象类中必须有一个方法为抽象方法,抽象中可以声明普通方法。
【举例】
abstract class Person{
abstract public function getName();
}
4)抽象类中可以普通方法可以有方法体
【举例】
abstract class Person{
abstract public function getName();
}
5)抽象类可以有属性
6)抽象类方法访问修饰符问题(public protected private)
子类继承抽象类后,访问修饰符不能大于父类(抽象类)。
【说明 】
① 如果抽象类中的抽象方法为protected,那么子类中必须是protected或public
② 如果抽象类中的抽象方法为public,那么子类中必须是public
③ 抽象类中抽象方法不能定义为private
7)子类可不完全实现抽象类中的所有方法。
二、interface接口
1) 接口使用interface声明,只定义功能,不包含内容实现。
2) 接口完全是抽象的,只能使用public声明方法,不能声明protected与private。
3) 接口不能定义方法休,不能声明实例变量,可以声明常量变量(不建议接口中声明变量常量)。
4)接口中定义的所有方法,其子类中必须全部实现
5)子类使用implements来实现interface,且子类可以实现多个interface
6)需要继承抽象类与实现接口时,extends必须在implements前
三、抽象类与接口的异同点
**抽象类:**是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。
**接口:**主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类
相同点:
① 两者都抽象类,都不能被实例化;
② interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。
不同点:
① 实现接口需要使用implemetns;abstract抽象类通过extends
② 一个类可以实现多个接口;一个类只能继承一个abstract 类
③ 接口强调特定功能的实现;abstract类强调所属关系
④ 接口中的每一个方法都是抽象方法,实现类必须事件;abstract抽象类,子类可以选择性实现
⑤ abstract抽象类中只有标有abstract的方法是抽象方法;子类继承abstract抽象类时,对非抽象方法可以继承也可以覆盖;
⑥ 接口中的抽象方法不能使用abstract关键字,默认隐式就是抽象方法;接口不能加final关键字来防止抽象方法的继承
⑦ 接口中的抽象方法默认是public
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2019年12月17日