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
相关产品推荐
相关产品推荐

