__construct()PHP 5 起支援統一命名的建構子 __construct(),取代舊式「同類別名稱函數」寫法。建構子在物件實例化時自動呼叫,適用於初始化屬性、建立資源連線、驗證參數等前置作業。
<?php
class Person {
public $name;
public $age;
public $sex = '男';
public function __construct($name = '', $sex = '男', $age = 22) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say() {
echo "我叫:{$this->name},性別:{$this->sex},年齡:{$this->age}";
}
}
// 不帶參數:使用預設值
$p1 = new Person(); // 我叫:,性別:男,年齡:22
// 帶部分參數
$p2 = new Person('小明'); // 我叫:小明,性別:男,年齡:22
// 帶完整參數
$p3 = new Person('李四', '男', 25); // 我叫:李四,性別:男,年齡:25
?>
<?php
class BaseClass {
public function __construct() {
echo "BaseClass 建構子
";
}
}
class SubClass extends BaseClass {
public function __construct() {
parent::__construct(); // 手動呼叫父類別建構子
echo "SubClass 建構子
";
}
}
$obj = new SubClass();
// 輸出:
// BaseClass 建構子
// SubClass 建構子
?>
<?php
class OtherSubClass extends BaseClass {
// 無 __construct,自動使用 BaseClass::__construct
}
$obj = new OtherSubClass(); // 輸出:BaseClass 建構子
?>
<?php
class OtherSub2Class extends BaseClass {
public function __construct() {
echo "OtherSub2Class 建構子
"; // 父類別建構子不會執行
}
}
$obj = new OtherSub2Class(); // 僅輸出:OtherSub2Class 建構子
?>
PHP 5.3.3 起,命名空間中「與類別同名的方法」不再視為建構子,僅認 __construct():
<?php
namespace Foo;
class Bar {
public function Bar() {
// PHP 5.3.0-5.3.2:視為建構子
// PHP 5.3.3+:視為普通方法
}
}
?>
__destruct()物件所有引用被釋放或顯式 unset()、腳本結束時自動呼叫。適用於關閉資料庫連線、釋放檔案控制代碼、寫入日誌等收尾工作。
<?php
class MyDestructableClass {
public function __construct() {
echo "建構子執行
";
$this->name = "MyDestructableClass";
}
public function __destruct() {
echo "解構子執行:銷毀 {$this->name}
";
}
}
$obj = new MyDestructableClass();
echo "腳本主體執行中
";
// 輸出順序:
// 建構子執行
// 腳本主體執行中
// 解構子執行:銷毀 MyDestructableClass
?>
同建構子,子類別定義 __destruct() 時需手動呼叫 parent::__destruct(),否則父類別清理邏輯不會執行。
__destruct() 中 throwheader() 或 setcookie()PHP 5 若找不到 __construct(),會嘗試尋找同名方法作為建構子。唯一衝突情況:類別已有 __construct() 卻被用於其他用途(極罕見)。
| 特性 | 建構子 __construct() | 解構子 __destruct() |
|---|---|---|
| 呼叫時機 | new 實例化瞬間 | 物件銷毀/腳本結束 |
| 參數支援 | 支援任意參數 | 不接受參數 |
| 繼承行為 | 子類別需手動 parent::__construct() | 子類別需手動 parent::__destruct() |
| 常見用途 | 初始化屬性、連線、驗證 | 釋放資源、關閉連線、記錄日誌 |
善用建構子/解構子配合繼承鏈,能建立清晰的物件生命週期管理,是 PHP 物件導向設計的基石。