抽象类必须显式声明为abstract class,否则报错;抽象方法须无实现体、显式访问控制符且不能为private;子类必须严格实现所有抽象方法并兼容签名。

抽象类不能靠“有没有抽象方法”来判断,必须显式用 abstract 声明,否则直接报错。
abstract class 必须写在 class 定义开头
PHP 不看类里写了几个 abstract function,只认声明本身。哪怕类里全是抽象方法,只要没写 abstract class MyClass,解析阶段就挂: Parse error: Cannot inherit from abstract class 或更隐蔽的运行时错误。
实操建议:
- 声明格式只能是
abstract class Name,class abstract Name或中间加空行/注释都会触发syntax error - 命名空间下继承时,必须用完整限定名:
class Dog extends \App\Abstract\Animal - 父类未
require或自动加载失败 →Fatal error: Class 'XXX' not found
抽象方法必须无实现体、显式访问控制符、不能是 private
abstract function getName() 后面不能跟花括号和逻辑,否则报 Parse error: Abstract function cannot contain body;也不允许写 private abstract function——PHP 直接拒绝解析。
实操建议:
- 抽象方法必须以分号结尾:
abstract public function save(array $data): bool; - 访问控制符(
public/protected)必须显式写出,不可省略 - PHP 8.2+ 支持
abstract static,但调用方式和生命周期完全不同,普通业务中基本不该用 - 返回类型和参数类型需兼容:父类返回
string,子类不能缩窄为"ok"字面量类型
子类 extends 后必须实现全部抽象方法,签名严格匹配
子类没实现某个抽象方法?PHP 不警告,直接报致命错误:Fatal error: Class contains abstract method and must therefore be declared abstract。更常见的是签名不兼容导致的 Declaration must be compatible —— 这不是类型提示警告,是解析失败级错误。
实操建议:
- 参数数量不能少(除非是可选参数),也不能多(即使带默认值也不行)
- 类型声明不能缺失:父类是
function load(int $id),子类写成function load($id)就不兼容 - 可变参数
...位置必须一致,function foo(...$args, $x)和function foo($x, ...$args)视为不同签名 - 用 IDE 的 “Go to Declaration” 对比签名,比肉眼检查可靠得多
构造函数、private 成员、static:: 绑定这些地方最容易翻车
抽象类可以有普通方法、属性、构造函数,但它仍受 PHP 继承规则约束。很多问题不是抽象类特有,而是所有继承场景共通的坑,只是在抽象类上下文中更容易被忽略。
实操建议:
- 子类定义了
__construct(),就必须手动调parent::__construct(),否则父类初始化逻辑全丢 - 父类
private $config在子类里完全不可见,parent::也调不了——这不是权限问题,是作用域隔离 - 想让子类能访问字段,父类得用
protected;想提供间接操作,就补public或protectedgetter/setter - 静态方法里用
self::指向定义类,用static::才指向实际调用类;工厂或单例场景下错一个就拿错实例
抽象类真正的复杂点不在语法,而在契约意识:它强制你思考“哪些行为必须由子类决定”,而不是“怎么把代码塞进去”。漏掉一个抽象方法实现、改错一个参数类型、或者误信 private 能被子类继承——这些都不是 PHP 的 bug,是你和契约之间还没对齐。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











