php 实现抽象方法
实现抽象方法的基本概念
在PHP中,抽象方法是指没有具体实现的方法,必须在继承的子类中被具体实现。抽象方法只能存在于抽象类中,抽象类本身不能被实例化,只能作为其他类的基类使用。
定义抽象类和抽象方法
使用abstract关键字定义抽象类和抽象方法。抽象方法只有声明,没有方法体。
abstract class AbstractClass {
// 抽象方法,没有具体实现
abstract protected function abstractMethod($param);
}
子类实现抽象方法
子类必须实现父类中所有的抽象方法,否则子类也必须声明为抽象类。实现时方法签名(名称、参数数量、可见性)必须一致。
class ConcreteClass extends AbstractClass {
protected function abstractMethod($param) {
// 具体实现
return $param . ' implemented';
}
}
方法可见性规则
子类实现抽象方法时,可见性可以等于或弱于父类方法的可见性。例如:
- 父类方法为
protected,子类可以是protected或public。 - 父类方法为
public,子类不能改为protected或private。
abstract class ParentClass {
abstract public function publicMethod();
abstract protected function protectedMethod();
}
class ChildClass extends ParentClass {
public function publicMethod() {
// 必须保持public
}
public function protectedMethod() {
// 可以改为public
}
}
参数类型和数量
子类实现抽象方法时,参数数量必须一致,但可以放宽参数类型限制(如父类未指定类型,子类可以添加类型;或父类为父类型,子类可为子类型)。
abstract class ParentClass {
abstract protected function methodWithParam($param);
}
class ChildClass extends ParentClass {
protected function methodWithParam(string $param) {
// 添加了string类型
}
}
实际应用示例
抽象方法常用于定义框架或库的扩展点,强制子类实现特定功能。
abstract class DatabaseDriver {
abstract public function connect($config);
abstract public function query($sql);
}
class MySQLDriver extends DatabaseDriver {
public function connect($config) {
// MySQL连接实现
}
public function query($sql) {
// MySQL查询实现
}
}
注意事项
- 抽象类可以包含非抽象方法(具体实现的方法)。
- 一个类如果包含至少一个抽象方法,必须声明为抽象类。
- 抽象方法不能声明为
private,因为子类无法实现它。 - PHP 7.4+支持抽象方法声明返回类型,子类实现时必须匹配。







