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

PHP 物件導程式設計核心:建構子與解構子完整指南

     編輯:PHP 相關知識

建構子 __construct()

物件實例化時(new ClassName())自動呼叫,用於初始化屬性、建立資源連線、載入配置等。

PHP 4 vs PHP 5+ 寫法演進

// PHP 4 風格(仍相容但不推薦)
class Person {
    function Person($name) {  // 類名同名方法
        $this->name = $name;
    }
}

// PHP 5+ 標準魔術方法(推薦)
class Person {
    public $name;
    public $age;
    public $sex;

    function __construct($name = '', $age = 0, $sex = '') {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
        echo "物件已建立:{$this->name}";
    }
}

建構子關鍵特性

  • 每個類別只能有一個建構子
  • 不可手動呼叫,僅在 new 時自動觸發
  • 支援參數預設值,實現多型建構效果
  • 繼承時子類別若定義建構子,不會自動呼叫父類別建構子,需手動 parent::__construct()

解構子 __destruct()

物件被銷毀前(記憶體釋放、腳本結束、unset())自動呼叫,用於釋放資源、關閉連線、寫入日誌等收尾工作。

class Database {
    private $link;

    function __construct($config) {
        $this->link = mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db']);
        if (!$this->link) die('連線失敗: ' . mysqli_connect_error());
    }

    function __destruct() {
        if ($this->link) {
            mysqli_close($this->link);
            echo "資料庫連線已關閉";
        }
    }
    
    function query($sql) {
        return mysqli_query($this->link, $sql);
    }
}

// 使用範例
$db = new Database(['host'=>'localhost','user'=>'root','pass'=>'','db'=>'test']);
$result = $db->query('SELECT * FROM users');
// 腳本結束或 unset($db) 時自動呼叫 __destruct() 關閉連線

$this 關鍵字深度解析

  • 代表當前呼叫方法的物件實例
  • 僅能在物件內部(非靜態方法)使用
  • 存取屬性:$this->property
  • 呼叫方法:$this->method()
  • 靜態方法中不可用 $this(無實例上下文)

魔術方法家族速查

方法觸發時機常見用途
__construct()物件建立時初始化
__destruct()物件銷毀前資源釋放
__call()呼叫不可存取方法動態代理
__callStatic()靜態呼叫不可存取方法靜態代理
__get()讀取不可存取屬性唯讀/計算屬性
__set()寫入不可存取屬性驗證/日誌
__isset()isset() 檢測不可存取屬性自定義存在判斷
__unset()unset() 不可存取屬性清理邏輯
__sleep()serialize() 前指定序列化屬性
__wakeup()unserialize() 後重建資源連線
__toString()物件當字串使用友善輸出
__invoke()物件當函數呼叫可呼叫物件
__clone()clone 物件後深拷貝處理
__debugInfo()var_dump() 時控制除錯輸出

實戰最佳實踐

  1. 建構子保持輕量,避免複雜邏輯、I/O 操作,改用工廠方法或延遲初始化
  2. 解構子不可拋出例外,會導致致命錯誤,僅做安全清理
  3. 依賴注入優於建構子硬編碼,提升可測試性
  4. 循環引用記憶體洩漏: PHP 5.3+ 有垃圾回收器(GC),但大量物件互參考時仍需手動 unset() 或實作 __destruct 斷開引用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved