这是一个序列化数据然后反序列化的代码。
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化。
我想只得到我序列化的那些结果。
答案 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不是序列化数据的一部分,而是来自你的类定义。