1. 什么是抽象类?
抽象类是一种不能够被实例化的类,它只能作为其他类的基类被继承。
在PHP中,抽象类通常被用于定义一些基础的方法和属性,它们被认为是抽象的,因为它们没有具体的实现。
以下是抽象类的定义方式:
abstract class AbstractClass
{
// 抽象方法必须被子类实现
abstract protected function abstractMethod();
// 普通方法可以直接实现
public function normalMethod()
{
return "This is normal method.";
}
}
抽象类由abstract关键字来修饰,其中抽象方法必须被子类实现,而普通方法可以直接实现。
2. 抽象类的用法示例
抽象类通常被用于定义一些基础的方法和属性,然后让子类来实现这些方法和属性。
2.1 定义抽象类
以下是一个定义了抽象方法的抽象类:
abstract class Database
{
public $host = 'localhost';
public $port = '3306';
public $user = 'root';
public $pass = 'root';
public $dbname = 'test';
abstract public function query($sql);
abstract public function fetchAll($result);
}
这个类定义了一些基础的属性和两个抽象方法:query和fetchAll。
2.2 子类继承抽象类
以下是一个继承了上面定义的抽象类的子类:
class Mysql extends Database
{
private $link = null;
public function __construct()
{
$this->link = mysqli_connect($this->host . ':' . $this->port, $this->user, $this->pass, $this->dbname);
if (!$this->link) {
throw new Exception(mysqli_connect_error());
}
}
public function query($sql)
{
$result = mysqli_query($this->link, $sql);
if (!$result) {
throw new Exception(mysqli_error($this->link));
}
return $result;
}
public function fetchAll($result)
{
$rows = array();
while ($row = mysqli_fetch_assoc($result)) {
$rows[] = $row;
}
return $rows;
}
}
这个类继承了抽象类,并且实现了抽象类中定义的query和fetchAll方法。
2.3 使用子类对象操作数据库
以下是使用Mysql类对象来操作数据库的示例:
try {
$mysql = new Mysql();
$result = $mysql->query("SELECT * FROM test");
$rows = $mysql->fetchAll($result);
foreach ($rows as $row) {
echo "id: " . $row['id'] . ", name: " . $row['name'] . ", age: " . $row['age'] . "<br>\n";
}
} catch (Exception $e) {
echo $e->getMessage();
}
这个示例中,首先创建了一个Mysql对象,然后调用了它的query方法来查询数据库,并且调用fetchAll方法来获取查询结果。
3. 总结
抽象类是一种不能够被实例化的类,它通常被用于定义一些基础的方法和属性,然后让子类来实现这些方法和属性。在PHP中,抽象类由abstract关键字来修饰,并且抽象方法必须被子类实现。