在 PHP 中,__sleep和__wakeup方法在对象的序列化和反序列化过程中起到不同的作用。
__sleep方法被调用时,它返回的属性数组会被序列化并保存到字符串中,这样在反序列化时可以使用这些属性来重新构建对象。它通常用于处理对象中敏感或大量的属性,在序列化时可以选择性地保存某些属性。
以下是一个示例:
class MyClass {
public $property1;
public $property2;
public function __construct($value1, $value2) {
$this->property1 = $value1;
$this->property2 = $value2;
}
public function __sleep() {
return array('property1'); // 只保存 property1 属性
}
}
$obj = new MyClass('Value 1', 'Value 2');
$serialized = serialize($obj); // 序列化对象
echo $serialized;
输出结果为:O:7:"MyClass":1:{s:10:"property1";s:7:"Value 1";}
在上面的示例中,__sleep方法返回一个只包含property1属性的数组,所以序列化时只保存了property1的值,property2被忽略了。
__wakeup方法在对象被反序列化后被调用,可以用于在反序列化后进行一些初始化操作。它没有参数,所以可以根据需要自行处理对象的初始化逻辑。以下是示例:
class MyClass {
public $property1;
public function __wakeup() {
$this->property1 = "Default Value"; // 初始化 property1 属性
}
}
$serialized = 'O:7:"MyClass":1:{s:10:"property1";s:7:"Value 1";}';
$obj = unserialize($serialized); // 反序列化对象
print_r($obj);
输出结果为:
MyClass Object
(
[property1] => Default Value
)
在上面的示例中,__wakeup方法在反序列化后将property1属性的值初始化为 "Default Value"。
总结: