php 7.2抽象类重写规则分四类:一、强制重写(abstract方法未实现即报致命错误);二、访问控制允许扩大(protected→public)、禁止缩小(public→protected/private);三、参数签名须严格一致(含默认值),返回类型无语法约束;四、private属性不继承,非重写。

你需要把PHP 7.2中抽象类重写的零散要点整理成清晰、可检索、不重复的分类笔记,避免混杂继承规则、接口对比、语法错误示例等干扰信息。
按重写触发条件分类
方法一:强制重写(必须实现)
当父类声明了 abstract public function doWork();,子类继承时未实现该方法,PHP 7.2会立即抛出致命错误:Fatal error: Class Child contains abstract method doWork and must therefore be declared abstract or implement the remaining methods。这一步不可跳过,也不支持延迟实现。
方法二:选择重写(可覆盖非抽象方法)
抽象类中已提供具体实现的普通方法(如 public function log($msg) { error_log($msg); }),子类可自由决定是否重写。若重写,需保持签名兼容——参数个数、类型提示(PHP 7.2已支持)、返回类型(PHP 7.1+协变支持)一致;否则调用时可能静默失败或报Strict Standards警告。
按访问控制变化分类
第一步:允许扩大可见性
父类定义为 abstract protected function run();,子类可实现为 public function run() { ... }。这是框架常用设计:基类保留核心逻辑为protected abstract,子类暴露为public接口供外部调用。
第二步:禁止缩小可见性
若父类是 abstract public function init();,子类写成 protected function init() { ... },PHP 7.2会报错:Access level to Child::init must be public (as in class Parent)。private实现直接被拒绝,连解析阶段都过不去。
第三步:构造方法不受约束
__construct() 不受 abstract 约束,子类可全新定义。但若需复用父类初始化逻辑,必须显式调用 parent::__construct(...);漏掉这句不会报错,但父类依赖的属性可能未初始化。
按参数与返回值契约分类
方法1:参数签名必须严格一致
父类声明 abstract public function handle(string $id, int $timeout = 30);,子类实现时不能删掉$timeout、不能改成 float $timeout、也不能加第三个必填参数。PHP 7.2对参数类型协变支持有限,仅允许子类参数类型更宽松(如父类int,子类mixed),但实际开发中应避免——易引发运行时类型错误。
方法2:返回类型可收缩(逆变)
PHP 7.4起才正式支持返回类型声明的逆变,PHP 7.2不支持 : User 这类显式返回类型标注。因此在7.2环境下,所有抽象方法的返回值仍靠文档和约定保障,无法通过语法强制。若强行升级到7.4+,此处需补全返回类型并验证子类是否满足逆变规则。
按错误排查高频场景分类
场景一:默认参数缺失导致签名不兼容
父类抽象方法带默认值 abstract public function format($data, $sep = ',');,子类实现时若写成 public function format($data) { ... }(省略$sep),PHP 7.2会报 Declaration of Child::format() must be compatible with Parent::format()。因为默认参数属于方法签名一部分,省略即视为签名变更。
场景二:private属性引发的“伪重写”错觉
抽象类中定义 private $cache = [];,子类声明同名 private $cache = []; 并非重写,而是两个独立属性。子类调用父类方法时读取的是父类private副本,极易造成数据不同步。要共享状态,必须用 protected 修饰。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











