在 PHP 中 __sleep 和__wakeup 有什么区别?

分享
已结 精华
0 267
chichu
chichu 2023-07-14

在 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"。

总结:

  • __sleep 方法用于选择性地保存对象的属性到字符串中,在序列化时生效。
  • __wakeup 方法用于反序列化后对对象进行初始化操作,在反序列化时生效。


上一篇:用PHP写一个冒泡排序算法

下一篇:在php中,如何将数据导出到 Excel 文件中 ?

回帖
取消评论