PHP子类如何访问父类__construct设置的公共属性?
子类访问父类构造函数设置的公共属性问题解析
这个问题其实戳中了PHP继承中构造函数执行的一个关键细节——子类如果定义了自己的构造函数,父类的构造函数不会自动执行,这就是你一开始无法访问父类设置的属性的核心原因。
为什么一开始没显示内容?
举个和你场景匹配的错误示例,你大概率是这么写的:
class ParentClass { public $pVariable; public function __construct() { // 父类构造里给属性赋值 $this->pVariable = 123; } } class ChildClass extends ParentClass { // 子类定义了自己的构造函数,但没管父类的 public function __construct() { // 这里只写了子类自己的初始化逻辑 } public function showInfo() { echo $this->pVariable; // 此时pVariable是null,因为父类构造没跑 } public function setPVariable() { $this->pVariable = 123; // 手动赋值后才有值 } } // 实例化子类 $child = new ChildClass(); if ($_GET['info']) { $child->showInfo(); // 访问site.php/?info自然没输出 }
PHP的规则是:当子类拥有自己的__construct方法时,父类的构造函数会被覆盖,不会自动触发。所以父类里给$pVariable赋值的逻辑根本没执行,属性自然是空的。而你调用setPVariable()是手动给属性赋值,所以能显示内容。
正确的解决方式
只需要在子类的构造函数里显式调用父类的构造函数,就能让父类的初始化逻辑执行:
class ChildClass extends ParentClass { public function __construct() { // 先调用父类构造,保证父类属性被初始化 parent::__construct(); // 再写子类自己的构造逻辑 // ... } public function showInfo() { echo $this->pVariable; // 现在会正常输出123 } }
如果子类没有自己的构造函数,那实例化子类时会自动继承并执行父类的构造函数,这种情况也能正常访问属性,不需要额外操作。
最佳实践建议
- 强制调用父类构造:只要子类有自定义构造逻辑,第一时间调用
parent::__construct(),避免父类初始化逻辑丢失。如果父类构造需要参数,记得传递对应的值,比如parent::__construct($param1, $param2)。 - 封装属性而非暴露公共属性:尽量把父类的属性设为
protected(子类可访问,外部不可直接修改),然后提供getter方法来访问,这样更符合面向对象的封装原则,也能避免属性被意外修改:
class ParentClass { protected $pVariable; public function __construct() { $this->pVariable = 123; } // 提供getter方法供子类/外部访问 public function getPVariable() { return $this->pVariable; } } class ChildClass extends ParentClass { public function __construct() { parent::__construct(); } public function showInfo() { echo $this->getPVariable(); // 通过getter访问属性 } }
内容的提问来源于stack exchange,提问作者passwd
相关产品推荐
相关产品推荐

