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

PHP 魔術方法完整指南與實戰範例

     編輯:PHP 相關知識

什麼是魔術方法?

PHP 類別中以雙底線 __ 開頭的方法,會在特定生命週期或操作時自動被呼叫,提供物件導程式的攔截與擴充能力。

常用魔術方法詳解

1. __construct() 建構子

實例化物件時自動呼叫。PHP 5 起若同時存在同名方法與 __construct,優先呼叫 __construct。

class User {
    public function __construct(public string $name) {}
}
$user = new User('張三'); // 自動執行

2. __destruct() 解構子

物件銷毀(引用計數歸零或腳本結束)時呼叫,適合釋放資源、關閉連線。

class DB {
    public function __destruct() { $this->conn->close(); }
}

3. __get($name) 讀取不可見屬性

嘗試讀取不存在或 protected/private 屬性時觸發,可實作動態屬性、代理模式。

class Config {
    private $data = [];
    public function __get($key) { return $this->data[$key] ?? null; }
}

4. __set($name, $value) 寫入不可見屬性

嘗試寫入不存在或不可見屬性時觸發,常用於資料驗證、日誌記錄。

class Model {
    public function __set($key, $value) {
        if (in_array($key, $this->fillable)) $this->attrs[$key] = $value;
    }
}

5. __call($method, $args) 呼叫不可見方法

呼叫不存在的方法時觸發,適用於動態方法、外觀模式、ORM 查詢建構。

class Repository {
    public function __call($method, $args) {
        if (str_starts_with($method, 'findBy')) {
            $field = lcfirst(substr($method, 6));
            return $this->query($field, $args[0]);
        }
        throw new BadMethodCallException($method);
    }
}

6. __toString() 物件轉字串

echo $obj 或字串語境下自動呼叫,必須回傳字串。

class Money {
    public function __toString() { return '$' . $this->amount; }
}

7. __clone() 物件複製

clone $obj 時呼叫,用於深層複製(複製內部物件資源)。

class Order {
    public function __clone() { $this->items = clone $this->items; }
}

其他進階魔術方法

  • __invoke():讓物件可像函數一樣被呼叫 $obj()。
  • __set_state():var_export() 匯出類別時的靜態工廠方法。
  • __debugInfo():var_dump() 時自訂顯示屬性。
  • __serialize() / __unserialize():PHP 7.4+ 新序列化協議。

最佳實踐建議

  1. 善用 __get/__set 實作資料模型的動態屬性存取。
  2. __call 配合 method_exists 避免無限遞迴。
  3. 序列化相關方法優先使用新版 __serialize/__unserialize。
  4. 避免在魔術方法中執行重度邏輯,影響效能與除錯難度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved