首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 類與對象進階(三):構造函數與析構函數詳解

     編輯:PHP 綜合知識

構造函數 __construct()

PHP 5 引入統一構造函數名 __construct()。創建對象時自動調用,適合初始化工作。

關鍵規則:父類構造函數不自動調用

若子類定義了 __construct(),不會隱式調用父類構造函數。需在子類中顯式調用 parent::__construct()。這與 Java/C++ 行為不同。

class BaseClass {
    function __construct() { print "In BaseClass constructor\n"; }
}
class SubClass extends BaseClass {
    function __construct() {
        parent::__construct(); // 必須顯式調用
        print "In SubClass constructor\n";
    }
}
$obj = new BaseClass(); // 輸出 BaseClass constructor
$obj = new SubClass();  // 輸出 BaseClass constructor + SubClass constructor

向後兼容

若類中無 __construct(),PHP 5 會嘗試查找同名舊式構造函數(類名函數)。唯一衝突場景:類中已有 __construct() 但非構造函數用途。

析構函數 __destruct()

PHP 5 引入析構函數,類似 C++。當對象所有引用被刪除或顯式銷毀(unset())時執行。

class MyDestructableClass {
    function __construct() {
        print "In constructor\n";
        $this->name = "MyDestructableClass";
    }
    function __destruct() {
        print "Destroying " . $this->name . "\n";
    }
}
$obj = new MyDestructableClass();
// 腳本結束或 unset($obj) 時輸出:Destroying MyDestructableClass

父類析構函數同樣不自動調用

子類析構函數中必須顯式調用 parent::__destruct()。

重要注意事項

  • 腳本關閉時調用:析構函數在腳本關閉階段執行,此時所有 HTTP 頭已發送,無法再輸出內容或修改頭信息。
  • 不可拋出異常:在析構函數中 throw 異常會導致致命錯誤(Fatal Error)。
  • 循環引用:對象間相互引用可能延遲析構,PHP 5.3+ 引入垃圾回收機制(GC)處理循環引用。

最佳實踐

  1. 始終使用 __construct() 而非同名函數,確保兼容性與可讀性。
  2. 子類構造/析構函數首行調用 parent::__construct() / parent::__destruct(),保證父類初始化/清理邏輯執行。
  3. 析構函數僅用於釋放非內存資源(關閉句柄、釋放鎖、寫入日誌),避免複雜邏輯。
  4. 依賴注入容器管理對象生命周期時,析構函數調用時機由容器控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved