细说PHP面向对象abstract与interface的区别

作者: 温新

分类: 【PHP基础】

阅读: 2662

时间: 2019-12-16 16:00:27

一、抽象类 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日

请登录后再评论