Z
ZHANK
面向对象

魔术方法

__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 时控制输出