PHP反序列化1(基础入门)
考点1:反序列化基础
<aside> 💡
序列化格式
</aside>
对象类型: 对象名长度:”对象名”:对象成员变量个数:{变量1类型:变量名1长度:变量名1; 参数1类型:参数1长度:参数1; 变量2类型:变量名2长度:”变量名2”; 参数2类型:参数2长度:参数2;… …}
如:O:6:”Person”:2:{s:12:” Person name”;s:8:”Thinking”;s:11:” Person sex”;s:3:”man”;} a:2:{s:4:”name”;s:8:”Thinking”;s:3:”sex”;s:3:”man”;}
**对象类型:**Class-O,Array-a。
**变量和参数类型:**string-s,int-i,Array-a,指针引用-R。
**序列符号:**参数与变量之间用分号(;)隔开,同一变量和同一参数之间的数据用冒号(:)隔开。
类型 | 结构 |
---|---|
字符串 | s:size:value; |
整数 | i:value; |
布尔值 | b:value;(保存1或0) |
空值 | N; |
数组 | a:size:{key definition;value definition;(repeated per element)} |
对象 | O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)} |
指针引用 | R:2; |
<aside> 💡
三种访问控制的区别
</aside>
public: 变量名
protected: \x00 + * + \x00 + 变量名(或 \00 + * + \00 + 变量名 或 %00 + * + %00 + 变量名)
private: \x00 + 类名 + \x00 + 变量名(或 \00 + 类名 + \00 + 变量名 或 %00 + 类名 + %00 + 变量名)
注:>=php v7.2 反序列化对访问类别不敏感(protected -> public)
<aside> 💡
魔术方法
</aside>
魔术方法 | 触发条件 |
---|---|
__call | 调用不可访问或不存在的方法时被调用 __call($name, $args) |
__callStatic | 调用不可访问或不存在的静态方法时被调用 |
__clone | 进行对象clone时被调用,用来调整对象的克隆行为 |
__constuct | 构建对象的时被调用 |
__debuginfo | 当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本 |
__destruct | 明确销毁对象或脚本结束时被调用; |
__get | 读取不可访问或不存在属性时被调用 |
__invoke | 当以函数方式调用对象时被调用 |
__set | 当给不可访问或不存在属性赋值时被调用 |
__set_state | 当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。 |
__sleep | 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用 |
__toString | 当一个类被转换成字符串时被调用 |
__unset | 对不可访问或不存在的属性进行unset时被调用 |
__wakeup | 当使用unserialize时被调用,可用于做些对象的初始化操作 |