在 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"。
总结: