
当子类未定义构造函数时,php会自动调用父类的公共构造函数;若父类构造函数为protected或private,则实例化子类会报错——这是php继承机制的核心规则。
当子类未定义构造函数时,php会自动调用父类的公共构造函数;若父类构造函数为protected或private,则实例化子类会报错——这是php继承机制的核心规则。
在PHP面向对象编程中,类的继承(Inheritance)决定了子类与父类之间行为和状态的传递关系。你提供的代码示例清晰地体现了这一机制的关键点:
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'); // ✅ 成功:B无__construct,自动调用A::__construct()
$test->display(); // 输出:provided value
✅ 关键原理:
- 类 B 没有定义自己的 __construct() 方法,因此 PHP 在实例化 new B(...) 时,自动向上查找并调用父类 A 的公共构造函数;
- 构造函数参数 'provided value' 直接传入 A::__construct(),完成 $changeableString 的初始化;
- B 继承了 A 的所有非私有属性和方法(包括 $changeableString 和其初始化逻辑),display() 只是新增行为,无需额外传参即可访问已初始化的属性。
⚠️ 重要前提:父类构造函数必须是 public
若将 A::__construct() 声明为 protected 或 private,则 new B('...') 将触发致命错误:
Fatal error: Uncaught Error: Call to protected A::__construct() from global scope
原因在于:子类 B 无法访问 protected 父构造函数,且自身又未重写(override)它,导致实例化链中断。
? 正确实践建议:
- 若父类构造函数需被子类继承调用,务必声明为 public;
- 若需强制子类实现特定初始化逻辑,可将父类构造函数设为 protected 并在子类中显式调用 parent::__construct(...);
- 子类如需扩展初始化行为,应明确定义自己的 __construct() 并手动调用 parent::__construct():
class B extends A {
public function __construct($text, $suffix = '') {
parent::__construct($text . $suffix); // 显式调用父构造
}
public function display() {
echo $this->changeableString;
}
}
总结:PHP的构造函数继承不是“自动代理”,而是“自动委派”——仅当子类无构造函数且父类构造函数可访问时才生效。理解这一机制,是写出健壮、可维护继承结构的基础。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











