在php中,abstract与interface类似,都是对抽象属性以及方法的处理,但是什么时候该使用abstract修饰,
什么时候又该使用interface修饰,让我们来学习一下
首先,来了解abstract相关属性:
所谓抽象类,那便是在类的方法中只要有一个使用了abstract修饰的方法,那此方法便是抽象方法,此
类便属于一个抽象类(其中,抽象方法只能时:public、protected),那么此时,需要我们也必须在类的
前面使用abstract进行修饰,其中可以含有类属性。
当一个类属与一个抽象类时,那么此时,当前类便不能直接被实例化,只能被继承
如上图,便是属于一个抽象类,fun2为抽象方法,其中作为子类的B必须要在类中实现抽象类中的抽象方
法,不然会报错,而由于抽象类A中的fun1为一个普通的方法,故而可以不用在B中实现。
interface类:
interface与abstract类类似,只是interface中全部为抽象方法与属性,必须在子类中进行实现。接
口只能使用implements实现,不能被继承,一个类可以实现多个接口,多个以逗号分隔,如下图:
上图中C为一个接口类,D实现接口C,在C中的方法,D中必须实现,其中接口C中的方法只能使用public
修饰,同时,接口C中不能含有类属性,如图,会直接报错。
abstract与interface的异同:
相同点:
(1)两者都是抽象类,都不能实例化。
(2)interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。
不同点:
(1) interface interface 只能使用 implements实现 ,而 abstract 需要使用 extends 。
(2)interface一个类可以实现多
interface ,但一个类只能继承一个 abstract
类 。
(3) interface 主要强调功能的实现,而 abstract
class 强调类与类之间的所属关系。
(4)接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private ,
protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。
使用场景:
interface:
(1)类与类之间需要特定的接口来进行关联,不在乎如何实现接口内的功能
(2)指定项目中一套统一的格式
abstract:
(1)定义了一组接口,但是接口所在的类中还有其他非接口的功能实现
(2)类与类中的协调还需要不同的变量来区别不同的关系
(3)父类与子类中各自存在不同的功能