PHP - 如何使用(UNSERIALIZE)反序列化数据

时间:2013-05-22 05:55:39

标签: php serialization

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

 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它如何做到我无法对所有类进行seril化。
我想只得到我序列化的那些结果。

2 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分:0)

当您致电unserialize()时,您将使用默认的magicmethod值创建新的$fruit对象。 fruit-array不是序列化数据的一部分,而是来自你的类定义。