php 8.3 类继承语法仍为 extends,但只读属性不可在子类重声明、子类构造函数必须显式调用 parent::__construct()、方法重写需严格协变返回类型、private 方法不参与多态。

PHP 8.3 的类继承本身语法没变,还是 extends,但关键变化在只读属性(readonly)和方法重写的约束上——这些地方不注意,运行时会直接报错或行为出人意料。
只读属性在子类中不能重复声明
PHP 8.3 明确禁止子类用 public readonly 重新声明父类已定义的同名只读属性。这不是警告,是语法错误。
- 父类写了
public readonly string $id;,子类再写一遍public readonly string $id;→ 报Cannot redeclare property - 子类必须省略该属性声明,仅通过
parent::__construct()传递值完成初始化 - 如果父类只读属性是
protected,子类仍不可重声明;private则根本不可见,自然无法继承或访问 - 想让子类也能控制初始化逻辑?把初始化参数提前到父类构造函数里,由子类传入计算后的值,而不是自己“再赋一次”
子类构造函数必须显式调用 parent::__construct()
只要父类有构造函数(尤其含只读属性初始化),子类就**不能省略** parent::__construct()。否则只读属性未被赋值,实例化时会触发 Uninitialized readonly property 错误。
- 即使子类构造函数参数和父类完全一致,也得手动调用,PHP 不自动转发
- 若父类构造函数带默认参数,子类仍需显式调用,不能依赖“空参调用”绕过
- 多个只读属性时,确保所有父类只读属性都在
parent::__construct()中被覆盖,漏一个就崩
方法重写要严格协变返回类型
PHP 8.3 强化了返回类型协变检查。父类方法返回 Animal,子类重写后返回 Dog(Dog extends Animal)合法;但返回 string 或 int 就会报 Declaration must be compatible。
- 类型提示必须是父类返回类型的子类型,不能是无关类型,也不能是更宽泛的联合类型(如
Animal|Plant) - 如果父类方法没声明返回类型,子类重写时加了
: string,不算协变,而是新增约束——这本身合法,但要注意调用方是否依赖无类型返回 - 抽象方法实现、接口方法实现同样受此规则约束,不只是普通重写
多态入口别用 private 方法
private 方法不会被继承,也不会参与多态分发。哪怕子类定义同名 private 方法,它和父类的完全是两个符号,调用时绑定的是声明类,不是运行时对象类型。
- 想让多态生效,方法至少要是
protected或public - 抽象类里的抽象方法必须是
public或protected,private abstract是语法错误 - 接口方法默认就是
public,实现类也必须用public实现,用protected会报错
最易被忽略的点:只读属性的“不可修改”是运行时保障,但它的“可继承性”取决于可见性+声明位置+构造链完整性——三者缺一不可。写完继承结构后,务必用真实实例跑一遍构造过程,别只看 IDE 没报错就以为稳了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











