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

 

其实就是两个函数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 ) ) ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值