PHP 中以雙底線 __ 開頭的方法稱為魔術方法,會在特定情境下自動被呼叫。本文系統整理 11 個核心魔術方法的用途、觸發時機與注意事項。
__get($property):讀取未聲明或不可見(protected/private)屬性時觸發。__set($property, $value):寫入未聲明或不可見屬性時觸發。__isset($property):對不可見屬性呼叫 isset() 時觸發。__unset($property):對不可見屬性呼叫 unset() 時觸發。__call($method, $args):呼叫未定義或不可見方法時觸發,包含方法名與參數陣列。
嘗試使用未定義類時自動調用。PHP 7.2+ 棄用,請改用 spl_autoload_register()。 拋出的異常無法被 catch 捕獲。
__construct():實例化物件時自動呼叫,優於同名方法。__destruct():物件銷毀前(記憶體釋放前)呼叫,可用於釋放資源、關閉連線。PHP 5 採用參考賦值,需用 clone 關鍵字複製物件,執行時自動呼叫 __clone(),可在其中執行初始化操作(如深複製資源)。
echo $obj 或字串語境下自動呼叫。E_RECOVERABLE_ERROR(PHP 5.2+)。echo/print 觸發,之後所有字串語境均生效。__sleep():serialize() 前呼叫,回傳需序列化的屬性名陣列,可關閉資源、提交資料。__wakeup():unserialize() 時呼叫,重建資料庫連線等資源。PHP 5.1+,var_export() 導出類時調用,接收屬性陣列,回傳物件實例。
PHP 5.3+,嘗試以函數方式呼叫物件($obj())時觸發。
PHP 5.3+,處理不可見靜態方法呼叫,必須聲明為 public static。
| 方法 | 最低版本 |
|---|---|
| __autoload | PHP 5(已棄用) |
| __invoke, __callStatic | PHP 5.3 |
| 其他 | PHP 5 |
所有魔術方法必須聲明為 public,否則不會被觸發。