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

PHP子类继承父类场景下构造函数传值机制疑问

PHP类继承构造函数传参机制答疑

你对继承逻辑的理解存在一处核心偏差:构造函数的执行是在实例化对象的阶段触发的,和子类的display()方法没有任何关联,参数传递根本不需要经过display()方法。

核心规则说明:

  • 当子类没有重写自己的构造方法时,实例化子类传入的所有参数,会自动传递给父类的公开构造方法执行。你执行$test = new B('provided value');这行代码的时候,PHP就已经自动调用了从A类继承来的__construct方法,把传入的字符串赋值给了实例的$changeableString属性,这一步在调用display()之前就已经全部执行完成了。
  • 被protected修饰的类属性会被子类直接继承,display()方法只是读取当前实例上已经被构造函数赋值好的属性值,不需要承担向父类传参的职责。
  • 只有当子类自己重写了__construct构造方法时,才需要手动通过parent::__construct(...)语法把参数传递给父类构造函数,否则父类的构造逻辑不会执行。

修正后的可运行示例代码:

class A {
    protected $changeableString = 'initial value';

    public function __construct($providedText)
    {
        $this->changeableString = $providedText;        
    }

    public function printString(){
        echo $this->changeableString;
    }
}
class B extends A {
    public function display(){
        echo $this->changeableString;
    }
}

$test = new B('provided value');
$test->display(); // 输出 provided value

编辑说明:已根据反馈将__construct构造方法的访问修饰符从protected修改为public,原protected写法会抛出实例化权限错误,以上为可正常运行的正确代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:01:01