class Object {
protected $data = [];
public function __set($key, $value) {
var_dump(__METHOD__);
$this->data[$key] = $value;
}
public function __get($key) {
var_dump(__METHOD__);
return $this->data[$key] ?? null;
}
}
$obj = new Object();
$obj->title = 'hello'; // 觸發 __set
echo $obj->title; // 觸發 __get
輸出: Object::__set、Object::__get、hello
class Object {
public function __call($method, $args) {
var_dump($method, $args);
return "magic function\n";
}
static function __callStatic($method, $args) {
var_dump($method, $args);
return "static magic\n";
}
}
$obj = new Object();
echo $obj->test('hello', 123); // 觸發 __call
echo Object::test('hello', 1234); // 觸發 __callStatic
輸出: 方法名、參數陣列、返回字串
class Object {
public function __toString() {
return __CLASS__;
}
}
$obj = new Object();
echo $obj; // 輸出 "Object"(否則會報 Catchable fatal error)
class Object {
public function __invoke($param) {
var_dump($param);
return 'invoked';
}
}
$obj = new Object();
echo $obj("test"); // 輸出 string(4) "test" 然後 "invoked"
| 方法 | 觸發時機 | 典型用途 |
|---|---|---|
| __construct | new 實例化 | 初始化 |
| __destruct | 物件銷毀 | 資源釋放 |
| __get/__set | 存取不可見屬性 | 動態屬性、資料代理 |
| __isset/__unset | isset()/unset() 不可見屬性 | 配合 __get/__set |
| __call/__callStatic | 呼叫不可見方法 | 動態方法、委派模式 |
| __toString | echo $obj / (string)$obj | 物件字串表示 |
| __invoke | $obj() 呼叫 | 可呼叫物件、策略模式 |
| __clone | clone $obj | 深拷貝控制 |
| __sleep/__wakeup | serialize()/unserialize() | 序列化控制 |
| __debugInfo | var_dump($obj) | 自訂除錯輸出 |