Сериализация объектов __sleep - PullRequest
4 голосов
/ 02 марта 2011

Руководство 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 голосов
/ 02 марта 2011

При десериализации создается новый экземпляр объекта, и поскольку ваше определение класса инициализирует атрибут, вы получаете для него значение по умолчанию.Попробуйте это:

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) и увидеть, что в нем нет базы.

1 голос
/ 02 марта 2011

Вы определяете начальное значение '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);
...