a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";} 比如这种序列化的东西,在是对代码的一种压缩,今天我们来详细讲解一下!
把复杂的数据类型压缩到一个字符串中
serialize()把变量和它们的值编码成文本形式
unserialize()恢复原先变量
eg:
$stooges=array('Moe','Larry','Curly');
$new=serialize($stooges);
print_r($new);echo"";
print_r(unserialize($new));
结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array([0]=>Moe[1]=>Larry[2]=>Curly)
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
$shopping=array('Poppyseedbagel'=>2,'PlainBagel'=>1,'Lox'=>4);
echo'next';
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
$new_cart=unserialize(stripslashes($cart));//如果magic_quotes_gpc开启
$new_cart=unserialize($cart);
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
$fp=fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat=unserialize(stripslashes(file_get_contents('/tmp/cart')));
//如果magic_quotes_runtime关闭
$new_cat=unserialize(file_get_contents('/tmp/cart'));
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
mysql_query("insertintocart(id,data)values(1,'".addslashes(serialize($cart))."')");
$rs=mysql_query('selectdatafromcartwhereid=1');
$ob=mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart=unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart=unserialize($ob->data);
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。