有利于存储和传递value(除了resource类型外),却不会丢失其原有类型和结构。
serialize序列化时会调用魔术方法__sleep();
unserialize反序列化时会调用魔术方法__wakeup();
序列化 数组:
$arr = ['name'=>'Tony','age'=>29,'sex'=>'male']; $s = serialize($arr); echo '序列化数组:'; var_dump($s); echo '反序列化数组:'; var_dump(unserialize($s));
输出
E:Projectselfdemoserializedemo.php:8:string 'a:3:{s:4:"name";s:4:"Tony";s:3:"age";i:29;s:3:"sex";s:4:"male";}' (length=64) 反序列化数组: E:Projectselfdemoserializedemo.php:10: array (size=3) 'name' => string 'Tony' (length=4) 'age' => int 29 'sex' => string 'male' (length=4)
序列化对象:
新建一个对象:
class A{ public $one = 1; public function show_one(){ echo $this->one; } }
require_once('class_a.php'); $s = serialize(new A); //把变量$s保存起来以便其他地方能够读取到 file_put_contents('store', $s);
require_once('class_a.php'); $s = file_get_contents('store'); $a = unserialize($s); var_dump($s); var_dump($a); //现在使用对象$a里面的函数 $a->show_one();
输出
E:Projectselfdemoserializedemo.php:18:string 'O:1:"A":1:{s:3:"one";i:1;}' (length=26) E:Projectselfdemoserializedemo.php:19: object(A)[1] public 'one' => int 1 1
危害与防御:
当用户对于反序列化的参数是可控的,利用__toString等是很容易造成意想不到的危害,所以最好在参数外面再套一层,例如json_decode。