首页  >  文章  >  后端开发  >  深入了解php中序列化与反序列化

深入了解php中序列化与反序列化

迷茫
迷茫原创
2017-03-26 11:05:201347浏览

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式

unserialize() 恢复原先变量

<span style="color: #800080">$stooges = <span style="color: #0000ff"><a href="http://www.php.cn/wiki/1041.html" target="_blank">array</a>(&#39;Moe&#39;,&#39;Larry&#39;,&#39;Curly&#39;);<br/><span style="color: #800080">$<a href="http://www.php.cn/wiki/165.html" target="_blank">new</a> = <span style="color: #008080">serialize(<span style="color: #800080">$stooges);<br/><span style="color: #008080"><a href="http://www.php.cn/wiki/1362.html" target="_blank">print</a>_r(<span style="color: #800080">$new);<span style="color: #0000ff"><a href="http://www.php.cn/wiki/1343.html" target="_blank">echo</a> "<br />";<br/><span style="color: #008080">print_r(<span style="color: #008080">unserialize(<span style="color: #800080">$new));</span></span></span></span></span></span></span></span></span></span></span>

结果: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元字符进行处理:

<span style="color: #800080">$shopping = <span style="color: #0000ff">array(&#39;Poppy seed bagel&#39; => 2,&#39;Plain Bagel&#39; =>1,&#39;Lox&#39; =>4);<br/><span style="color: #0000ff">echo &#39;<a href="next.php?cart=&#39;.<span style="color: #008080">urlencode(<span style="color: #008080">serialize(<span style="color: #800080">$shopping)).&#39;">next</a>&#39;;</span></span></span></span></span></span>

margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。

如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:

<span style="color: #800080">$new_cart = <span style="color: #008080">unserialize(<span style="color: #008080">stripslashes(<span style="color: #800080">$cart)); <span style="color: #008000">//<span style="color: #008000">如果magic_quotes_gpc开启<span style="color: #008000"><br/><span style="color: #800080">$new_cart = <span style="color: #008080">unserialize(<span style="color: #800080">$cart);</span></span></span></span></span></span></span></span></span></span>

如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:

//当对一个对象进行反序列化操作时,PHP会自动地调用其wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。

以上是深入了解php中序列化与反序列化的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn