集中整理 PHP 物件導向 13 個魔術方法觸發時機、用途,以及 5 個魔術常數輸出內容,方便開發時快速查閱。
13 大魔術方法
| 方法 | 觸發時機 | 典型用途 |
__construct() | 實例化 new Class() | 初始化資源、注入依賴 |
__destruct() | 物件銷毀 (引用歸零、腳本結束) | 釋放連線、關閉檔案、記錄日誌 |
__call($name, $args) | 呼叫不存在的方法 | 動態代理、多載、API 自動路由 |
__callStatic($name, $args) | 靜態呼叫不存在的方法 | 靜態工廠、ActiveRecord 查詢 |
__get($name) | 讀取不可存取屬性 | 虛擬屬性、延遲載入、資料轉換 |
__set($name, $value) | 寫入不可存取屬性 | 驗證、觸發事件、同步快取 |
__isset($name) | isset($obj->prop) | 配合 __get 實作虛擬屬性存在性 |
__unset($name) | unset($obj->prop) | 清理虛擬屬性、觸發同步 |
__toString() | echo $obj、字串語境 | 物件輸出摘要、除錯、模板渲染 |
__invoke() | $obj() 當函式呼叫 | 可呼叫物件、策略模式、閉包替代 |
__clone() | clone $obj | 深層複製、重設 ID、複製資源 |
__sleep() | serialize($obj) 前 | 指定序列化屬性、關閉連線 |
__wakeup() | unserialize($data) 後 | 重建連線、還原狀態 |
__set_state($arr) | var_export($obj) 時 | 靜態工廠還原物件 (配合 var_export) |
__autoload($class) | 使用未定義類別 (PHP 7.2 棄用) | 自動載入類別檔案 (改用 spl_autoload_register) |
5 大魔術常數
| 常數 | 輸出內容 | 注意事項 |
__LINE__ | 目前行號 | |
__FILE__ | 完整絕對路徑 (含檔名) | PHP 4.0.2+ 固定絕對路徑 |
__DIR__ | 目錄絕對路徑 (不含檔名) | PHP 5.3+ 等同 dirname(__FILE__) |
__FUNCTION__ | 函式名稱 (區分大小寫) | PHP 4.3+、PHP 5 保留定義時大小寫 |
__CLASS__ | 類別名稱 (區分大小寫) | PHP 4.3+、PHP 5 保留定義時大小寫 |
__METHOD__ | 類別方法名稱 | PHP 5.0+ |
__NAMESPACE__ | 目前命名空間名稱 | PHP 5.3+ |
常見組合技
__sleep + __wakeup:大型物件序列化只存 ID、反序列化自動從 DB 重載。
__get + __set + __isset + __unset:實作動態屬性袋 (如 Laravel Model)。
__call + __callStatic:建立流暢介面 (Fluent API) 或動態 Proxy。