9.5 抽象类和接口
抽象类和接口都是不能被实例化的特殊类,可以在抽象类和接口中保留公共的方法,将抽象类和接口作为公共的基类。
9.5.1 抽象类
创建一个抽象类可使用关键词abstract,语法格式如下:
创建一个抽象类可使用关键词abstract
abstract class class_name{
abstract public function func_name1($arg1,$arg2);
abstract public function func_name2($arg1,$arg2,$arg3);
}
一个抽象类必须至少包含一个抽象方法,抽象类中的方法不能被定义为私有的(private),因为抽象类中的方法需要被子类覆盖,同样抽象类中的方法也不能用final修饰,因为其需要被子类继承。抽象类中的抽象方法不包含方法实体。如果一个类中包含了一个抽象方法,那么这个类也必须声明为抽象类。
比如我们定义一个数据库抽象类,有很多种数据库,比如MySQL、Oracle、MSSQL等,虽然每种数据库都有不同的使用方法,但是对于数据库来说都有一些共同的操作部分,比如建立数据库链接、查询数据、关闭数据库链接等。这样我们就能抽象出可适用于不同数据库操作的抽象基类。如下示例定义一个抽象Database类:
<?php
abstract class database{
abstract function connect($host,$username,$pwd,$db);
abstract function query($sql);
abstract function fetch();
abstract function close();
function test(){
echo 'test';
}
}
下面定义一个MySQL类继承自抽象基类Database。
class mysql extends database{
protected $conn;
protected $query;
function connect($host, $username, $pwd, $db)
{
$this->conn=new mysqli($host,$username,$pwd,$db);
}
function query($sql)
{
// TODO: Implement query() method.
return $this->conn->query($sql);
}
function fetch()
{
// TODO: Implement fetch() method.
return $this->conn->fetch();
}
function close()
{
// TODO: Implement close() method.
$this->conn->close();
}
}
抽象类中的抽象方法必须被子类实现(除非该抽象类的子类也为抽象类),否则会报错;抽象类中的非抽象方法可不被子类实现(如示例中的test()方法)。非抽象方法必须包含实体,抽象方法不能包含实体。
9.5.2 接口
子类只能继承自一个抽象类,却可以继承自多个接口。接口实现了PHP的多重继承。声明一个接口的关键词是interface
样,接口是需要被继承的,所以接口中定义的方法不能为私有方法或被final修饰。接口中定义的方法必须被子类实现,并且不能包含实体。
接口中所有的方法都必须被子类实现
与抽象类不同的是,一个子类可继承自多个接口
类继承多个接口,多个接口之间用“, ”分开,类要实现其继承的所有接口的全部方法。
除了类可以继承接口外,接口也可以继承接口。