抽象类和接口几乎相同,只不过方法体里可以包含函数体内容。抽象类必须是“extended——扩展”,而不是“implements——实现”。因此,如果扩展类一些方法都需要完成,那么你可以定义一个抽象类。我们来看代码清单2-18:
代码清单2-18 生成HTML报表的抽象类
<?php //abstract.reportgenerator.php abstract class ReportGenerator{ //声明为抽象类 public function generateReport($resultArray){ //生成HTML报表 } }?>
在上面的抽象类中,有一个名为generateReport的方法,它接收一个多维数组作为参数,然后生成一个HTML报表。
那为什么我们声明一个抽象类?因为后面会用到一个通用DBDriver,它不会影响代码,因为它正在作为一个参数,而不是任何相关的数据库本身只有一个数组。现在我们用这个MySQLDriver的抽象类,如代码清单2-19所示:
代码清单2-19 使用抽象类并实现MySQLDriver的方法
<?php include("interface.dbdriver.php"); //引入dbdriver接口 include("abstract.reportgenerator.php"); //引用HTML报表抽象类 class MySQLDriver extends ReportGenerator implements DBDriver { public function connect() { //连接数据库 } public function execute($query) { //执行SQL查询并返回 } }?>
大家可能注意到,MySQLDriver扩展了ReportGenerator抽象类并实现了DBDriver接口。
我们可以使用抽象类,并全部实现上面的例子所示的接口。
类似声明抽象类,你还可以声明抽象方法。当一个方法声明为抽象时,意味着子类必须重写该方法。
一个抽象的方法不包含任何内容。抽象方法的声明如下所示:
abstract public function connectDB();