PHP中的抽象类是一种不能被实例化的类,它主要用于定义接口或者为子类提供共享的方法实现。抽象类的主要目的是作为其他类的基类(父类),并强制要求子类实现(或覆盖)某些方法。这有助于实现代码的复用和标准化。
### 抽象类的特点
1. **抽象方法**:抽象类可以包含抽象方法,这些方法是只有声明而没有具体实现的。抽象方法以`abstract`关键字声明,并且不包含方法体(即没有大括号`{}`)。
2. **不能被实例化**:尝试实例化一个抽象类将会导致一个致命错误(Fatal Error)。
3. **子类实现**:如果子类继承了一个抽象类,它必须实现(覆盖)该抽象类中定义的所有抽象方法,除非子类本身也是抽象的。
4. **访问修饰符**:抽象方法默认为`public`,但也可以使用其他访问修饰符(如`protected`或`private`)进行定义。然而,如果抽象方法被声明为`private`或`protected`,则该类及其子类都不能被实例化,这实际上违背了抽象类的初衷。
### 示例代码
abstract class Animal {
// 抽象方法
abstract public function makeSound();
// 非抽象方法
public function move() {
echo "This animal can move.\n";
}
}
class Dog extends Animal {
// 实现抽象方法
public function makeSound() {
echo "Woof!\n";
}
}
// 使用
$dog = new Dog();
$dog->makeSound(); // 输出: Woof!
$dog->move(); // 输出: This animal can move.
// 尝试实例化抽象类将会失败
// $animal = new Animal(); // 这将引发致命错误
在这个例子中,`Animal`是一个抽象类,它定义了一个抽象方法`makeSound()`和一个非抽象方法`move()`。`Dog`类继承自`Animal`类,并实现了`makeSound()`方法。尝试实例化`Animal`类将会失败,因为它是一个抽象类。但是,可以成功实例化`Dog`类,因为`Dog`类提供了`Animal`类中所有抽象方法的实现。