You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP继承只读类的子类实例化报错:无法修改只读属性?

问题原因分析

这个报错的核心原因是readonly属性只能被初始化一次,你的代码对继承自父类的readonly属性进行了重复赋值操作,具体拆解如下:

  1. readonly类的属性特性:PHP 8.2引入的readonly类会将所有类属性隐式标记为readonly,这类属性只能在所属类的构造函数中完成一次初始化,后续任何修改或重复赋值都会触发异常。

  2. 代码执行流程问题:

    • 实例化ChildClass时,子类构造函数的参数提升机制会先尝试初始化自身声明的$lastName属性,但由于ChildClass继承自ParentClass,这个$lastName本质上是父类的readonly属性(子类不能重新声明父类readonly类的已有属性);
    • 随后调用parent::__construct($lastName)时,父类构造函数会再次尝试给ParentClass::$lastName赋值,此时该属性已经被初始化过一次,违反了readonly属性的赋值规则,因此抛出异常。
修复方案

去掉子类构造函数中对$lastName的属性声明,仅将其作为普通参数传递给父类构造函数即可,子类无需重复声明继承自父类的属性:

readonly class ParentClass {
    public function __construct(
        public string $lastName
    ){
    }
}

readonly class ChildClass extends ParentClass {
    public function __construct(
        public string $firstName,
        string $lastName // 仅作为参数,不声明为类属性
    ){
        parent::__construct($lastName);
    }
}

$child = new ChildClass('John', 'Doe');

这样$lastName仅在父类构造函数中完成一次初始化,符合readonly属性的使用规则,不会再触发异常。

内容的提问来源于stack exchange,提问作者Tommy Hoang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:21:12