无论我们使用的开发语言是Java / .Net / PHP……,只要是面向对象的语言,都是支持抽象类(Abstract Class)和接口(Interface)的。

    他们是面向对象思想层面的概念,而不属于某种程序设计语言。在Java/.NET/PHP中,我们用interface关键字来定义接口;在C++中,我们通过创建一个只包含纯虚方法的类来定义接口。虽然同样是接口的概念,在不同语言中,我们用了不同的实现方式。所以,只要理解了两者的本质,在任何面向对象的语言中,它们的概念都是相通的。

    但是,两者在其自身特性及应用方法上存在着诸多的相似性。例如,他们都不能被实例化、都可以被继承(严格来说接口应该叫做被实现)。因此,在很多人心中抽象类与接口的界限十分模糊,对何时该使用抽象类、何时该使用接口没有一个比较明确的概念。

    本文就用PHP中的抽象类和接口的区别来简单做一个比较,看能不能给有疑问的你提供一点点帮助。

一、区别:

1、抽象类是实体的抽象;接口是行为的抽象;(抽象类表示“是一个(IS-A)”关系的抽象,接口表示“能(CAN-DO)”关系的抽象。)

2、抽象类是类(Class),接口是集合(Set),两者从本质上就不是同一种东西;(抽象类的使用动机是在不允许实例化的限制下复用代码;接口的使用动机是实现对象间的低耦合和多态。)

3、接口是通过 implements 关键字继承来实现的;而抽象类是通过 extends 关键字继承来实现的;(PHP中,接口也可以通过关键字 extends 继承来实现)

4、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量;抽象类中可以声明各种类型成员变量,实现数据的封装(JAVA接口中的成员变量都要声明为public static final类型)。

5、接口没有构造函数,抽象类可以有构造函数;

6、接口中的方法默认都是public类型的;而抽象类中的方法可以使用private,protected,public来修饰,抽象方法必须用abstract声明;

7、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类;

二、相同:

1、都不能被实例化;

2、函数体内都不能写任何实现代码,连两个大括号都不能写;

三、如何选择:

1、如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口;
2、如果必须从多个来源继承行为,就使用接口;
3、如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。