其实就是两个函数serialize()和unserialize()。做什么用的呢?官方说明
Generates a storable representation of a value
This is useful for storing or passing PHP values around without losing their type and structure.
生成一个可存储的值,可以很方便地存储或传递PHP值,同时保持原来的结构 。可以序列化所有的数据结构,除了资源类型(保存的是引用,而不是实际的值)。一些PHP内部方法里就使用了序列化,如session。
session_start
(
)
;
$_SESSION
[
'data'
]
=
array
(
'hello'
,
'php'
)
;
//最终被转化为如下格式,保存在文件中
//data|a:2:{i:0;s:5:"hello";i:1;s:3:"php";}
都可以用来做什么呢?
页面之间传递值
有两个页面,要传递一个object,又不想用$_SESSION,这时就可以考虑序列化。
<?php
//page1.php
class
test
{
private
$i
=
1
;
public
function
display(
)
{
echo
'$i='
.
$i
;
}
}
$test
=
new
test(
)
;
<
form action=
'page2.php'
method=
'post'
>
<
input type=
"hidden"
name=
"data"
value=
"<?php serialize($test
); ?>"
/>
<
input type=
"submit"
value=
"submit"
/>
</
form>
//page2.php
$test
=
unserialize
(
$_POST
[
'data'
]
)
;
$test
->
display
(
)
;
保存数据到数据库
wordpress的插件参数就是序列化后保存到数据库。
<?php
$data
=
$_POST
[
'data'
]
;
//array
if
(
get_magic_quotes_gpc
(
)
)
{
//去掉自动添加的转义符,避免被二次转义
$data
=
stripslashes
(
$data
)
;
}
//避免序列化后出现的特殊字符对SQL造成干扰
$data
=
mysql_real_escape_string
(
serialize
(
$data
)
)
;
//执行数据库操作...
缓存文件
kohana的缓存系统就是通过序列化实现的,原理session差不多。
注意
尽量不要序列化浮点数,如3.14159之类的,会有意想不到的结果
<?php
$val
=
3.14159
;
var_dump
(
$val
)
;
// initial value: float(3.14159)
$val
=
serialize
(
$val
)
;
var_dump
(
$val
)
;
// string(55) "d:3.14158999999999988261834005243144929409027099609375;"
如果在处理特殊字符上实在觉得麻烦,就用base64来帮忙
$send_data
=
base64_encode
(
serialize
(
$obj
)
)
;
$receive_data
=
unserialize
(
base64_decode
(
$send_data
)
)
;