对象序列化 __sleep

4

PHP手册中写道:

它可以清理对象并且应该返回一个包含该对象中所有需要序列化的变量名称的数组。

我的理解是,如果我有一个类,像这样:

<?php

class Foo {

    public $bar = 'bar';

    public $baz = 'baz';

    public function __sleep() {
        return array('bar');
    }

}

$obj = new Foo();
$serialized = serialize($obj);
$unserialized = unserialize($serialized);

var_dump($unserialized);

?>

它只会序列化对象和属性$bar吗?就像这样:
object(Foo)[2]
  public 'bar' => string 'bar' (length=3)

但是它返回:
object(Foo)[2]
  public 'bar' => string 'bar' (length=3)
  public 'baz' => string 'baz' (length=3)

我是否理解错误?还是我的做法有误?

2个回答

6

反序列化会创建一个对象的新实例,由于您定义的类初始化了属性,因此您将获得其默认值。请尝试以下操作:

class Foo {
    public $bar;
    public $baz;
    public function __sleep()
    {
        return array('bar');
    }
}

$obj = new Foo();
$obj->bar = 'bar';
$obj->baz = 'baz';
$serialized = serialize($obj);
$unserialized = unserialize($serialized);
var_dump($unserialized);

编辑:或者,您可以使用 vardump($serialized) 查看其中没有 baz。


谢谢,你让它变得非常易懂。 - Esben
或者将初始化移动到构造函数中,因为unserialize不会调用构造函数,你的baz可能会保持未初始化状态。 - Niki Romagnoli

1
你为$baz属性定义了一个初始值'baz',所以在反序列化时,PHP会使用该默认值重新创建baz,尽管它不是序列化对象的一部分。 如果在序列化之前更改了baz的值,然后进行序列化/反序列化操作,它将重置baz为'baz'的默认值,而不是你之前更改的值。
class Foo {
    public $bar = 'bar';

    public $baz = 'baz';

    public function __sleep() {
        return array('bar');
    }
}

$obj = new Foo();
$obj->baz = 'newbaz';

var_dump($obj);

$serialized = serialize($obj);
$unserialized = unserialize($serialized);
var_dump($unserialized);

谢谢,你让它变得非常易懂。 - Esben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接