PHP 類別中以雙底線 __ 開頭的方法,會在特定生命週期或操作時自動被呼叫,提供物件導程式的攔截與擴充能力。
實例化物件時自動呼叫。PHP 5 起若同時存在同名方法與 __construct,優先呼叫 __construct。
class User {
public function __construct(public string $name) {}
}
$user = new User('張三'); // 自動執行
物件銷毀(引用計數歸零或腳本結束)時呼叫,適合釋放資源、關閉連線。
class DB {
public function __destruct() { $this->conn->close(); }
}
嘗試讀取不存在或 protected/private 屬性時觸發,可實作動態屬性、代理模式。
class Config {
private $data = [];
public function __get($key) { return $this->data[$key] ?? null; }
}
嘗試寫入不存在或不可見屬性時觸發,常用於資料驗證、日誌記錄。
class Model {
public function __set($key, $value) {
if (in_array($key, $this->fillable)) $this->attrs[$key] = $value;
}
}
呼叫不存在的方法時觸發,適用於動態方法、外觀模式、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);
}
}
echo $obj 或字串語境下自動呼叫,必須回傳字串。
class Money {
public function __toString() { return '$' . $this->amount; }
}
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+ 新序列化協議。__get/__set 實作資料模型的動態屬性存取。__call 配合 method_exists 避免無限遞迴。__serialize/__unserialize。