PHP 4 僅支援對外部物件模型(Java/COM)的映射多載。PHP 5 引入使用者層級多載,允許自定義屬性存取與方法呼叫行為。
| 方法 | 觸發時機 | 參數 | 回傳值 |
|---|---|---|---|
__get($name) | 讀取不可見/不存在屬性 | 屬性名稱 | 屬性值(或 null) |
__set($name, $value) | 寫入不可見/不存在屬性 | 屬性名稱、值 | 無 |
__call($name, $args) | 呼叫不可見/不存在方法 | 方法名稱、參數陣列 | 方法回傳值 |
<?php
class Overloader {
private $properties = array();
function __get($property_name) {
if (isset($this->properties[$property_name])) {
return $this->properties[$property_name];
}
return NULL;
}
function __set($property_name, $value) {
$this->properties[$property_name] = $value;
}
function __call($function_name, $args) {
print("Invoking $function_name()<br>\n");
print("Arguments: ");
print_r($args);
return TRUE;
}
}
$o = new Overloader();
// 觸發 __set()
$o->dynaProp = "Dynamic Content";
// 觸發 __get()
print($o->dynaProp . "<br>\n");
// 觸發 __call()
$o->dynaMethod("Leon", "Zeev");
?>
Dynamic Content Invoking dynaMethod() Arguments: Array ( [0] => Leon [1] => Zeev )
__set 中檢查型別、長度、權限,拒絕非法寫入__get 動態計算衍生屬性(如 $user->fullName 由 first+last 組合)__get/__set 透明映射資料表欄位,__call 代理查詢方法__call 將方法呼叫轉發至 SOAP/REST/XML-RPC 服務__get 必須有回傳值,否則無法用於表達式中__call 參數 $args 為數值索引陣列,非關聯陣列__get/__set 內部存取同名屬性會無限遞迴,需用內部儲存陣列(如範例 $properties)