php方法重写须满足:访问修饰符不能更严格;参数列表兼容(7.2+支持协变,7.4+支持返回类型协变);不可重写final方法;子类构造方法需显式调用parent::__construct()。

PHP 方法重写必须满足访问修饰符不更严格
子类重写父类方法时,不能将访问级别设得比父类更严格。比如父类方法是 public,子类重写后不能改为 protected 或 private;父类是 protected,子类可改为 public,但不能是 private。这是 PHP 的强制规则,违反会报致命错误 Fatal error: Access level to ... must be public。
参数列表需兼容(协变与逆变在 PHP 7.2+ 有细化支持)
重写方法的参数数量、顺序和类型声明必须与父类兼容:
- PHP 7.2 起支持参数类型协变(子类方法可使用更具体的类型,如父类参数为 Animal,子类可限定为 Dog)
- 返回类型支持协变(PHP 7.4+),即子类方法可返回更具体的类型
- 但参数不能“扩大”类型范围(如父类要求 string,子类不能改成 mixed)
- 可省略默认参数值,但不能新增非默认参数(否则调用父类签名时会出错)
不能重写被 final 声明的方法
如果父类方法用 final 修饰,子类中同名方法会被直接拒绝,PHP 解析阶段就报错:Cannot override final method。同样,final 类也不能被继承,自然也无法重写其任何方法。
构造方法 __construct 不是自动继承,重写需显式调用 parent::__construct()
子类定义了 __construct() 就不会自动执行父类构造方法。若需初始化父类逻辑,必须手动写 parent::__construct(...)。漏掉这一步是常见 bug,尤其在依赖父类属性初始化的场景下会导致未定义行为。
立即学习“PHP免费学习笔记(深入)”;









