
有利于存储和传递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:\Project\self\demo\serialize\demo.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:\Project\self\demo\serialize\demo.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:\Project\self\demo\serialize\demo.php:18:string 'O:1:"A":1:{s:3:"one";i:1;}' (length=26)
E:\Project\self\demo\serialize\demo.php:19:
object(A)[1]
public 'one' => int 1
1
危害与防御:
当用户对于反序列化的参数是可控的,利用__toString等是很容易造成意想不到的危害,所以最好在参数外面再套一层,例如json_decode。