序列化
在我看完这篇文章后,我终于懂了一些关于序列化的知识:
serialize() 函数会检查类中是否存在魔术方法比如 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。
先看代码:
1 | |
1.sleep()函数会在序列化时被调用,比如我现在有一个Person类,有name,sex和age三个变量,并且类中有 __sleep()函数
1 | |
会输出:
1 | |
他们分别表示:
变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}
O(object)表示对象,因为$p1是类Person的一个对象
这里我们可以看到,创建类对象时,是有“男”这一属性值的,但由于调用了 __sleep(),这一属性消失了,并且序列化后的属性数量由3变为了2,而当我最后使用:
1 | |
由于$p2是反序列化后的$p1,而反序列化时又会调用wakeup函数,它修改了age的值
故返回值为:
1 | |
可以看到,性别这一变量为空并且age为40
当私有成员序列化时: \x00 + [私有成员所在类名] + \x00 [变量名]
总结一下调用顺序:
当对象使用 serialize() 函数进行序列化时,如果该对象中定义了 __sleep() 方法,PHP 将自动调用该方法,并在序列化之前执行其中的逻辑,而对于__wakeup()函数则是在反序列化后执行的。
在序列化时使用 __sleep() 方法进行预处理,而在反序列化时使用 __wakeup() 方法进行后处理,可以实现序列化和反序列化过程的完整控制。
__sleep() ------->serialize()
unserialize() -------> __wakeup()