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

PHP 面向對象魔術方法全解析:從構造到序列化

     編輯:PHP 相關知識

魔術方法是 PHP 物件模型的核心特性,以雙下劃線 __ 開頭,在特定生命週期自動觸發。掌握它們能讓類設計更靈活、更符合框架開發規範。

13 個核心魔術方法速查表

方法觸發時機典型用途
__construct()實例化對象時初始化屬性、依賴注入、資源連接
__destruct()對象銷毀/腳本結束關閉連接、釋放資源、寫入日誌
__call($name, $args)調用不可訪問方法動態代理、方法別名、錯誤友好提示
__callStatic($name, $args)靜態調用不可訪問方法靜態工廠、鏈式調用入口
__get($name)讀取不可訪問屬性動態屬性、懶加載、數據映射
__set($name, $value)寫入不可訪問屬性屬性驗證、自動轉換、觸發事件
__isset($name)isset()/empty() 檢測不可訪問屬性配合 __get 實現完整屬性訪問控制
__unset($name)unset() 不可訪問屬性清理動態屬性、緩存失效
__toString()對象作為字符串使用調試輸出、模板渲染、日誌記錄
__invoke()對象作為函數調用閉包替代、策略模式、可調用對象
__clone()clone 複製對象時深拷貝、重置資源 ID、生成唯一標識
__sleep()serialize() 序列化前清理臨時數據、指定序列化屬性白名單
__wakeup()unserialize() 反序列化後重建連接、初始化資源、安全驗證
__set_state($arr)var_export() 導出類時自定義導出格式、單例模式還原
__debugInfo()var_dump() 輸出對象時隱藏敏感屬性、格式化調試輸出

關鍵注意事項

  • 構造函數優先級: 同時存在 __construct 和同名方法時,只調用 __construct
  • 可訪問性判斷: 「不可訪問」包含 private、protected、不存在 三種情況
  • __sleep 必須返回數組: 指定需序列化的屬性名,返回空數組則不序列化任何屬性
  • __wakeup 安全風險: 反序列化可實例化任意類,敏感操作需驗證
  • __toString 必須返回字符串: 否則拋出 E_RECOVERABLE_ERROR

實戰組合示例:ActiveRecord 基類

class Model {
    protected $data = [];
    protected $dirty = [];

    public function __get($name) {
        return $this->data[$name] ?? null;
    }

    public function __set($name, $value) {
        $this->dirty[$name] = true;
        $this->data[$name] = $value;
    }

    public function __isset($name) {
        return isset($this->data[$name]);
    }

    public function __unset($name) {
        unset($this->data[$name], $this->dirty[$name]);
    }

    public function __toString() {
        return get_class($this) . ': ' . json_encode($this->data);
    }

    public function save() {
        // 僅更新 dirty 屬性...
    }
}

善用魔術方法,能編寫出既優雅又強大的 PHP 類庫,是進階 PHPer 必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved