开发者

Object Serialization __sleep

开发者 https://www.devze.com 2023-02-14 17:57 出处:网络
the php manual states: It can clean up the object and is supposed to return an array with the names of all variables of that object

the php manual states:

It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized.

i understand this as, if a had a class. Like this:

<?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);

?>

it would only serialize the object and the property $b开发者_JS百科ar? Like this:

object(Foo)[2]
  public 'bar' => string 'bar' (length=3)

but it returns:

object(Foo)[2]
  public 'bar' => string 'bar' (length=3)
  public 'baz' => string 'baz' (length=3)

Have i interpreted it wrong? Or am i doing it wrong or what?


Unserializing creates a new instance of the object, and since your definition of the class initializes the attribute, you're getting a default value for it. Try this:

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);

Edit: Alternatively, you can vardump($serialized) and see that there is no baz in it.


You're defining an initial value of 'baz' for the $baz property, so when you unserialize, PHP recreated baz with that default value despite the fact that it's not part of the serialized object. If you changed the value of baz before serializing, then serialize/unserialize, it will reset baz to that default value of 'baz', rather than to the value you had changed it to.

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);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号