前几天安恒月赛两道web题中有一道题是关于php反序列化的,然后刚好前几天刚好看过这个知识点,于是乎这次比赛才没有爆零,总算是写出来了一道题/doge 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。 https://www.php.net/manual/zh/language.oop5.serialization.php 示例: 总之我的理解,就是序列化是将一个对象或者变量转化为字符串方便存储,然后反序列化就是将一个序列化后得到的字符串再还原原来的对象 可以观察到,在一个自己定义的类序列化和反序列化
<?php class demo{ public $a = 'thisisa'; protected $b = 'thisisb'; private $c = 'thisisc'; public function __toString(){ echo '__toString called <br>'; return 'this is demo.toString()'; } } $a = array('fir', 'sec', 'lalala'); $b = serialize($a); // a:3:{i:0;s:3:"fir";i:1;s:3:"sec";i:2;s:6:"lalala";} // 其中i指int var_dump(unserialize($b)); echo '<br>'; // array(3) { [0]=> string(3) "fir" [1]=> string(3) "sec" [2]=> string(6) "lalala" } $c = new demo(); echo $c; echo '<br>'; // __toString called // this is demo.toString() $b = serialize($c); echo $b; echo '<br>'; // O:4:"demo":3:{s:1:"a";s:7:"thisisa";s:4:"*b";s:7:"thisisb";s:7:"democ";s:7:"thisisc";} // 其中s指的是string,指变量名存储为字符串 $d = unserialize($b); echo $d; // __toString called // this is demo.toString()
序列化后的变量存储
demo
中,变量的类型不同(public
protected
private
),在序列化字符串中变量名是有相应的变化的O:4:"demo":3:{s:1:"a";s:7:"thisisa";s:4:"*b";s:7:"thisisb";s:7:"democ";s:7:"thisisc";}
public
变量,那么变量名和定义类时相同protected
变量,那么序列化后存储时会在变量名前添加