1

这是一个序列化数据然后反序列化的代码。

 class magicmethod {
protected $name = array('Arfan','Azeem','Haider');
protected $fruit = array('Apple','Bannana');
protected $animal = 'Cat';

public function __sleep(){
    return array('name','animal');
}

public function __wakeup(){
    echo 'Going to Unserialized'; 
}
  }

$obj = new magicmethod;

$ser = serialize($obj);

var_dump($ser);

var_dump(unserialize($ser));

我只是将其序列化$name$animal保存在变量名$ser中。在此之后,我反序列化了这个 var $ser,看到它反序列化了所有的类magicmethod,它还可以返回fruit array它是如何做到的,我不能序列化所有的类。
我只想得到那些我序列化的结果。

4

2 回答 2

0

您会看到这种行为,因为它们被设置为属性的默认值......如果您查看此示例,它将按照您期望的方式运行。

class magicmethod {
    protected $name;
    protected $fruit;
    protected $animal;

    public function setData(){
        $this->name = array('Arfan','Azeem','Haider');
        $this->fruit = array('Apple','Bannana');
        $this->animal = 'Cat';
    }
    public function __sleep(){
        return array('name','animal');
    }

    public function __wakeup(){
        echo 'Going to Unserialized'; 
    }
}

$obj = new magicmethod();
$obj->setData();
$ser = serialize($obj);
print_r($ser);

print_r(unserialize($ser));

发生的情况是,当反序列化发生时,它会从类定义中创建一个新对象(但绕过构造函数),然后将序列化的数据覆盖到类属性上。如果您仔细查看序列化值数据,您会注意到水果定义不存在。

于 2013-05-22T06:12:16.337 回答
0

当您调用 时unserialize(),您将创建一个magicmethod具有默认$fruit值的新对象。水果数组不是您的序列化数据的一部分,而是来自您的类定义。

于 2013-05-22T06:12:44.840 回答