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

抽象类不是“学完就能用”,而是“写错立刻报错”——它不给你试错空间,语法和契约约束全在解析阶段就生效。想少踩坑,得先盯住三个硬性门槛:abstract class 声明、abstract 方法无实现体、子类方法签名严格兼容。
abstract class 声明必须显式且位置固定
PHP 不看类里有没有抽象方法,只认声明本身。哪怕你写了十个 abstract function,只要没在开头写 abstract class MyClass,就会在解析时直接挂:Parse error 或 Fatal error。
-
class abstract MyClass是错的,abstract class MyClass才对 - 命名空间下继承时,子类
extends必须用完整限定名,比如extends \App\Abstract\Shape - 如果父类没被
require或自动加载失败,错误是Fatal error: Class 'XXX' not found,和抽象无关,但常被误判
abstract 方法不能有花括号,也不能省略访问控制符
抽象方法不是“留空的方法”,它是强制契约。写错格式 PHP 会拒绝解析,不是运行时报错。
-
abstract function getName();合法;abstract function getName() { return 'x'; }报Parse error: Abstract function cannot contain body -
abstract protected function save();合法;abstract function save();(缺访问控制符)在 PHP 8+ 直接报错 - PHP 8.2+ 支持
abstract static,但调用方式和生命周期完全不同,普通业务逻辑里基本不该用
子类实现时签名不兼容 = 致命错误,不是警告
这不是类型提示宽松与否的问题,而是方法定义是否能通过 PHP 解析器校验。一旦不匹配,Declaration must be compatible 就是致命错误,脚本终止。
- 参数数量不能多也不能少:父类
function load(int $id),子类写成function load($id)(缺类型)或function load(int $id, string $cacheKey = '')(多参数)都会失败 - 可变参数
...位置必须一致:function foo($x, ...$args)和function foo(...$args, $x)视为不同签名 - 返回类型基础类型(
string,int)必须完全一致;对象类型支持协变(如父类返回Animal,子类可返回Dog),但仅限 PHP 7.4+ - 用 IDE 的 “Go to Declaration” 对比签名,比肉眼检查可靠得多
最容易被忽略的是构造函数和属性初始化:抽象类可以有 __construct(),但子类若重写,必须显式调用 parent::__construct(),否则父类设定的默认状态(比如 $this->config)可能为空——这不是抽象类特有,却是继承链中最早出问题的地方。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











