魔术方法:__sleep、__wakeup
在学习序列化和反序列化时,会遇到__sleep和__wakeup两个函数。
这两个函数的执行时机与其命名有相当有趣的联系:
sleep是睡觉,开发人员把序列化(serialize)看作是一个类进入了梦乡,因此在这之前就要执行__sleep函数;
wakeup是起床,对应的把反序列化(unserialize)看作是一个类被唤醒了,因此在这之前就要执行__wakeup函数。
总结一下:__sleep在serialize前执行;__wakeup在unserialize前执行。
下面看一下测试代码: 这里也顺便测试了construct和destruct
[PS:注意__sleep函数需要返回一个你修改后的元素的数组。因为serialize后的是一个字符串不是一个类]
<?PHP
class FlagInfo
{
public $flag='null';
function __construct($flagstr)
{
echo "construct...\n";
$this->flag=$flagstr;
}
//__sleep表示当你执行serialize()这个序列化函数之前时的事情
function __sleep()
{
$this->flag="哈哈被我(sleep)给改了";
echo "sleep...\n";
return array('flag');
}
//__wakeup表示当你执行unserialize()这个序列化函数之前时的事情
function __wakeup()
{
echo "wakeup...\n\n";
$this->flag="嘿嘿被我(wakeup)被改了";
}
function __destruct()
{
echo "destruct...\n";
}
}
echo "这里新实例化一个对象:";
$a=new FlagInfo('这是一个flag');
print_r($a);echo "\n";
echo "这里序列化了一个对象:"."";
$Student_serialize=serialize($a);
echo $Student_serialize."\n\n";
echo "这里反序列化了一个对象:";
$aa=unserialize($Student_serialize);
echo "这是最初实例化的对象:\n";
print_r($a);echo "\n";
echo "这是反序列化得来的对象:\n";
print_r($aa);echo "\n";
?>
测试结果:
这里新实例化一个对象:construct...
FlagInfo Object
(
[flag] => 这是一个flag
)
这里序列化了一个对象:sleep...
O:8:"FlagInfo":1:{s:4:"flag";s:28:"哈哈被我(sleep)给改了";}
这里反序列化了一个对象:wakeup...
这是最初实例化的对象:
FlagInfo Object
(
[flag] => 哈哈被我(sleep)给改了
)
这是反序列化得来的对象:
FlagInfo Object
(
[flag] => 嘿嘿被我(wakeup)被改了
)
destruct...
destruct...
[Finished in 1.5s]