在定义一个类时,如果我们使用了abstract关键字,那么,这个类就会被定义为抽象的;抽象类有什么特点呢?很简单,它不能被实例化,也就是不能对象。那么,一个不能被实例化的类有什么用呢?简单的说,它是专用的父类,其唯一的作用就是让其它类来继承它的。
我们先看一下下面的代码。
我们首先定义了抽象类ClsA,然后,在其子类ClsB中,我们重写了work()方法,其中的CLASS是PHP的内部常量,表示当前类的名称,此代码会显示“ClsB is working.”。这两个类看起来可能并没有什么特别,但是,当我们创建ClsA类的实例时,就会产生错误,如下面的代码。
再看一下抽象类与抽象方法的定义:
- 定义类时,在class关键字前使用abstract关键字,这个类就会被定义为抽象类,抽象类不能被实例化。
- 定义抽象方法时,应在function关键字前使用abstract关键字,抽象方法没有方法体(即{}定义的代码块),而是直接使用分号(;)作为语句结束。当一个类中定义了一个抽象方法时,那么,这个类就必须定义为抽象类。
此外,我们知道,PHP中类的属性,其本质是变量,但我们是无法定义抽象变量的,所以,如果需要将属性的读、写定义为抽象,可以使用两种方法,一是使用getter和setter方法,如下面的代码。
使用getter和setter方法,虽然是在使用方法模拟属性的读写操作,但它可以更精确地指定属性的名称。第二种实现抽象属性的方法就是在类中定义抽象的get()和set()方法,如下面的代码。
关于get()和set()方法的特点,我们已经在上一章介绍过了,在实际应用中,我们可以根据实际需要选择具体的实现策略。