PHP 5 引入統一建構子 __construct(),但為相容 PHP 4 風格 (類名同名函數),保留了舊機制。若同時定義兩者,PHP 5 優先呼叫 __construct()。為了讓同一份程式碼在 PHP 4 與 PHP 5 皆能正常運作,採用「雙建構子模式」:PHP 5 用 __construct(),PHP 4 用同名方法並手動呼叫 __construct()。
<?php
class MyClass {
// PHP 5+ 建構子
public function __construct() {
echo 'PHP 5 建構子執行';
// 初始化邏輯放這裡
$this->init();
}
// PHP 4 建構子 (同類別名稱)
public function MyClass() {
// 手動呼叫統一建構子,確保邏輯復用
$this->__construct();
}
private function init() {
// 共用初始化代碼
}
}
// 實例化
$obj = new MyClass(); // PHP 4/5 均輸出: PHP 5 建構子執行
?>
| PHP 版本 | 呼叫順序 | 說明 |
|---|---|---|
| PHP 4 | MyClass() | 不識別 __construct,視為普通方法。呼叫同名方法 MyClass(),內部再呼叫 $this->__construct()。 |
| PHP 5+ | __construct() | 優先識別 __construct,直接呼叫。同名方法 MyClass() 降級為普通方法,不會自動執行。 |
PHP 5 引入 __destruct(),PHP 4 無對應機制。若需相容,僅在 PHP 5 定義即可:
<?php
class Database {
public function __construct() {
$this->connect();
}
public function Database() {
$this->__construct();
}
// PHP 5 解構子,關閉連線、釋放資源
public function __destruct() {
$this->close();
}
// PHP 4 無解構子,若需在腳本結束釋放資源,需註冊 shutdown function
// register_shutdown_function([$this, 'close']); // 但 $this 在 shutdown 可能已銷毀,謹慎使用
}
?>
public,若為單例模式可設 private。init(), run()),利於測試與繼承。__construct() 即可。本模式僅供維護極舊遺留系統參考。parent::__construct(),否則父類初始化邏輯不會執行。<?php
// 錯誤:重複邏輯,維護惡夢
class BadExample {
public function __construct() {
// 大量初始化代碼...
}
public function BadExample() {
// 又複製一遍相同代碼...
}
}
?>