PHP OOP __sleep() 和 __wakeup()

在 PHP 的面向对象编程(OOP)中,有两个魔术方法 __sleep()__wakeup(),它们用于在序列化或未序列化对象时进行一些处理。这可以帮助我们更好地控制对象的状态。

__sleep() 方法

当使用 serialize() 函数对一个对象进行序列化时,PHP 会自动调用该对象的 __sleep() 方法。这个方法应该返回一个包含对象中所有应该被序列化的变量名称的数组。如果对象没有定义 __sleep() 方法,则会尝试序列化对象中的所有变量。

示例:

class ExampleClass {
    public $var1;
    public $var2;
    public $var3;

    public function __sleep() {
        return array('var1', 'var2');
    }
}

在这个例子中,只有 $var1$var2 会被序列化。

__wakeup() 方法

当使用 unserialize() 函数对一个已经序列化的对象进行反序列化时,PHP 会自动调用该对象的 __wakeup() 方法。这个方法可以用于重新初始化一些变量、关闭数据库连接等操作。

示例:

class ExampleClass {
    public $var1;
    public $var2;
    public $dbConnection;

    public function __wakeup() {
        $this->dbConnection = new DatabaseConnection();
    }
}

在这个例子中,当对象被反序列化时,会重新建立数据库连接。

使用场景

这两个魔术方法常用于以下场景:

  • 需要保存对象的状态到外部存储(如数据库或文件),但是某些变量不应该被序列化。
  • 在反序列化后重新初始化一些资源、连接等。
  • 防止敏感信息泄露。

请注意,这两个方法只会影响 serialize()unserialize() 函数的行为,对其他序列化/反序列化操作(如 json_encode()json_decode())不起任何作用。