序列化
serialize()
<?php
class people{
public $name;
public $age;
}
$george = new people();
$george->name ='george';
$george->age = 10;
echo serialize($george);
//输出结果
O:6:"people":2:{s:4:"name";s:6:"george";s:3:"age";i:10;}
//其中O为被序列化变量类型
//6为对象名长度
//2有两个成员变量
//s字符串类型
//4个字符
- a - 数组
- b - 布尔
- d - 浮点(double)
- i - i整数
- o - 普通对象
- r - 引用
- s - 字符串
- C - 传统对象
- O - 类
- N - 空
- R - 指针引用
- U - unicode字符串
反序列化
unserialize()
魔术函数
__construct() 当一个对象创建时被调用,
__destruct() 当一个对象销毁时被调用,
__toString() 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruct() 对象被销毁时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或``empty``()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发
其中__destruct()与__wakeup()
常作为多个对象互相调用的入口
绕过__wakeup()
- php5<5.6.25或者php7<7.0.10
反序列化中属性个数值大于真实属性个数值时,会绕过__wakeup() 即不执行__wake(),但反序列化会失败.
调用__toString()
- 在将对象为字符串时,调用__toString()
- 输出时