Java 在實例化子類別時會**自動**呼叫父類別建構子(透過隱含 super()),確保所有屬性正確初始化。PHP **不會**自動呼叫父類別建構子,必須在子類別建構子中**手動**呼叫 parent::__construct()。
class Base {
public function __construct() {
// 基礎初始化邏輯
}
}
class Extender extends Base {
// 情境 1:完全沿用父類別初始化 → 可省略建構子
// 情境 2:需要父類別初始化「再」擴充 → 呼叫 parent::__construct() 後加入自己的邏輯
// 情境 3:不需要父類別初始化 → 不呼叫 parent::__construct()
}
class Extender extends Base {
public function __construct($extraParam) {
parent::__construct(); // 先完成基礎初始化
// 子類別額外邏輯
$this->extra = $extraParam;
}
}
class Extender extends Base {
public function __construct() {
// 故意不呼叫 parent::__construct()
$this->customInit();
}
}
隱患:若日後再有人繼承 Extender 並呼叫 parent::__construct(),將只能觸發 Extender 的建構子,無法回溯到 Base。這會造成初始化鏈斷裂。
parent::__construct(...),除非你非常確定不需要父類別任何初始化。parent::__construct($arg1, $arg2)。@method __construct 參數說明,方便繼承者參考。PHP 8 引入 建構子屬性提升,可簡化屬性宣告與賦值:
class Base {
public function __construct(
protected string $name,
protected int $id = 0
) {}
}
class Extender extends Base {
public function __construct(
string $name,
int $id = 0,
private string $extra = ''
) {
parent::__construct($name, $id);
}
}
此寫法自動處理屬性宣告、型別提示與父類別參數透傳,極大減少樣板碼。