3.7 抽象类与接口技术

抽象类和接口是PHP对象的高级应用,本节详细地介绍它们。

3.7.1 抽象类

抽象类是一种不能被实例化的类,只能作为其他类的子类来使用。抽象类使用abstract关键字定义。

抽象类和普通类类似,包含成员属性、成员方法。但是抽象类至少要包含一个抽象方法。抽象方法没有方法体,其功能的实现只能在子类中完成。抽象方法也需要使用abstract关键字来修饰。

抽象类和抽象方法的语法格式如下:

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。另外,这些方法的访问控制必须和父类中一样或者更为宽松。例如,某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

抽象类和抽象方法主要应用于复杂的层次关系中,这种层次关系要求每一个子类都包含并重写某些特定的方法。

下面通过一个实例来进行介绍。先定义一个商品抽象类Fruits,该抽象类包含一个抽象方法explain();然后为抽象类生成两个子类Apple和Banana,分别在两个子类中实现抽象方法;最后实例化两个对象,调用实现后的方法输出结果。

【例3-23】(实例文件:ch03\Chap3.23.php)抽象类的应用。

在IE浏览器中运行结果如图3-18所示。

图3-18 抽象类的应用

3.7.2 接口技术

PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此PHP引入了接口技术。

接口是通过interface关键字定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的,并且定义的所有方法都必须是公有,这是接口的特性。接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。例如下面的代码:

提示如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是public权限的,那么这种特殊的抽象类就称为接口。

实现接口,使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号分隔多个接口的名称。例如下面的代码:

注意实现多个接口时,接口中的方法不能有重名。接口也可以继承,通过使用extends操作符。

【例3-24】(实例文件:ch03\Chap3.24.php)接口技术的应用。

在IE浏览器中运行结果如图3-19所示。

图3-19 接口技术的应用

通过例3-24可以发现,抽象类和接口实现的功能十分相似。抽象类的优点是可以在抽象类中实现公共的方法,而接口则可以实现多继承。