在 PHP 物件導向程式設計中,建構子(__construct)與解構子(__destruct)分別標誌著物件的誕生與終結。掌握它們的觸發時機與行為,是撰寫資源管理正確程式的基礎。
當使用 new 關鍵字實例化類別時,建構子會自動被呼叫。若子類別未定義建構子,會自動尋找並呼叫父類別的建構子。
解構子會在以下三種情況自動觸發:
class Demo {
public $name;
public function __construct($name) {
$this->name = $name;
echo "物件 {$this->name} 已建立<br><br>";
}
public function __destruct() {
echo "物件 {$this->name} 已銷毀<br><br>";
}
}
$a = new Demo('A');
$b = new Demo('B');
$c = new Demo('C');
unset($b); // 明確銷毀 B
$c = 'new value'; // C 失去參考,觸發解構子
// 腳本結束時,A 才會被銷毀
物件 A 已建立 物件 B 已建立 物件 C 已建立 物件 B 已銷毀 物件 C 已銷毀 物件 A 已銷毀
觀察輸出順序可發現:unset($b) 立即觸發 B 的解構子;$c = 'new value' 導致 C 失去參考而觸發解構子;A 直到腳本結束才被銷毀。
子類別若定義了自己的建構子/解構子,不會自動呼叫父類別的對應方法,必須手動呼叫 parent::__construct() 或 parent::__destruct() 以確保父類別邏輯正確執行。