PHP的序列化与反序列化的使用

来源:互联网 发布:百度大数据怎么用 编辑:程序博客网 时间:2024/05/16 19:38

 

其实就是两个函数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));
原创粉丝点击