萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 建構子與解構子完整指南:從基礎語法到繼承機制深度解析

建構子 __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 建構子
?>

子類別定義建構子但未呼叫 parent::__construct()

<?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(),否則父類別清理邏輯不會執行。

特殊行為與注意事項

  • exit()/die():腳本中止時仍會呼叫解構子
  • 解構子中拋出異常:會導致 Fatal Error,切勿在 __destruct() 中 throw
  • HTTP 標頭已送出:解構子執行時標頭已發送,無法再 header() 或 setcookie()
  • 工作目錄可能改變:SAPI 環境下關閉階段工作目錄可能非專案根目錄,檔案操作請使用絕對路徑

舊式建構子相容性

PHP 5 若找不到 __construct(),會嘗試尋找同名方法作為建構子。唯一衝突情況:類別已有 __construct() 卻被用於其他用途(極罕見)。

總結

特性建構子 __construct()解構子 __destruct()
呼叫時機new 實例化瞬間物件銷毀/腳本結束
參數支援支援任意參數不接受參數
繼承行為子類別需手動 parent::__construct()子類別需手動 parent::__destruct()
常見用途初始化屬性、連線、驗證釋放資源、關閉連線、記錄日誌

善用建構子/解構子配合繼承鏈,能建立清晰的物件生命週期管理,是 PHP 物件導向設計的基石。

copyright © 萬盛學電腦網 all rights reserved