魔术方法
__get/__set/__call/__toString/__clone 等魔术方法
魔术方法
PHP 的魔术方法以 __ 开头——它们在特定时机自动触发,不需要手动调用。
学完本章你将: 掌握 __get/__set/__call/__toString/__clone。
常用魔术方法速查
php
<?php
class MagicDemo {
private array $data = [];
// __get —— 访问不存在的/私有属性时
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
// __set —— 设置不存在的/私有属性时
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
// __toString —— 对象被当作字符串时
public function __toString(): string {
return json_encode($this->data);
}
// __clone —— 对象被 clone 时
public function __clone(): void {
// 可用于深拷贝资源
}
}
$obj = new MagicDemo();
$obj->name = "小明"; // 触发 __set
echo $obj->name; // 触发 __get → "小明"
echo $obj; // 触发 __toString
其他魔术方法
php
<?php
// __call —— 调用不存在的方法时
public function __call(string $name, array $args): mixed { }
// __callStatic —— 调用不存在的静态方法时
public static function __callStatic(string $name, array $args): mixed { }
// __invoke —— 对象被当作函数调用时
public function __invoke(string $param): void { }
// __sleep / __wakeup —— 序列化/反序列化时
// __debugInfo —— var_dump 时控制输出