浅谈php serialize()与unserialize()的用法


Posted in PHP onJune 05, 2013

serialize()和unserialize()在php手册上的解释是:
serialize — Generates a storable representation of a value
serialize — 产生一个可存储的值的表示
unserialize — Creates a PHP value from a stored representation
unserialize — 从已存储的表示中创建 PHP 的值
很显然,"a stored representation"的解释翻译成了一个可存储的值后依然很让人非常费解它的意思。
如果语言已经无法表述清楚,那么我们可以以一个具体的PHP的例子来学习这两个函数的用途

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
//声明一个类
class dog {
    var $name;
    var $age;
    var $owner;
    function dog($in_name="unnamed",$in_age="0",$in_owner="unknown") {
        $this->name = $in_name;
        $this->age = $in_age;
        $this->owner = $in_owner;
    }
    function getage() {
        return ($this->age * 365);
    }    function getowner() {
        return ($this->owner);
    }
    function getname() {
        return ($this->name);
    }
}
//实例化这个类
$ourfirstdog = new dog("Rover",12,"Lisa and Graham");
//用serialize函数将这个实例转化为一个序列化的字符串
$dogdisc = serialize($ourfirstdog);
print $dogdisc; //$ourfirstdog 已经序列化为字符串 O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"Lisa and Graham";}
print '<BR>';
/* 
-----------------------------------------------------------------------
    在这里你可以将字符串 $dogdisc 存储到任何地方如 session,cookie,数据库,php文件 
-----------------------------------------------------------------------
*/
//我们在此注销这个类
unset($ourfirstdog);
/*    还原操作   */
/* 
-----------------------------------------------------------------------
    在这里将字符串 $dogdisc 从你存储的地方读出来如 session,cookie,数据库,php文件 
-----------------------------------------------------------------------
*/
//我们在这里用 unserialize() 还原已经序列化的对象
$pet = unserialize($dogdisc); //此时的 $pet 已经是前面的 $ourfirstdog 对象了
//获得年龄和名字属性
$old = $pet->getage();
$name = $pet->getname();
//这个类此时无需实例化可以继续使用,而且属性和值都是保持在序列化之前的状态
print "Our first dog is called $name and is $old days old<br>";
print '<BR>';
?>

例子中的对象我们还可以换为数组等其他类型,效果都是一样的!
其实serialize()就是将PHP中的变量如对象(object),数组(array)等等的值序列化为字符串后存储起来.序列化的字符串我们可以存储在其他地方如数据库、Session、Cookie等,序列化的操作并不会丢失这些值的类型和结构。这样这些变量的数据就可以在PHP页面、甚至是不同PHP程序间传递了。
而unserialize()就是把序列化的字符串转换回PHP的值。

这里再引用一段PHP手册上的说明,看了上面的例子,应该很容易明白下面这些话的意思了
想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。你正 serialize() 的数组/对象中的引用也将被存储。

当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 __wakeup() 成员函数
unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,可为 integer、float、string、array 或 object。如果传递的字符串不可解序列化,则返回 FALSE。

PHP 相关文章推荐
PHP_Flame(Version:Progress)的原代码
Oct 09 PHP
PHP+DBM的同学录程序(2)
Oct 09 PHP
PHP 输出缓存详解
Jun 20 PHP
PHP垃圾回收机制简单说明
Jul 22 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
PHP 透明水印生成代码
Aug 27 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
基于php 随机数的深入理解
Jun 05 #PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 #PHP
PHP中__get()和__set()的用法实例详解
Jun 04 #PHP
深入PHP运行环境配置的详解
Jun 04 #PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 #PHP
如何设置mysql允许外网访问
Jun 04 #PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 #PHP
You might like
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Python map及filter函数使用方法解析
2020/08/06 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
什么时候用assert
2015/05/08 面试题
党员公开承诺践诺书
2014/03/25 职场文书
安全协议书范本
2014/04/21 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
举起手来观后感
2015/06/09 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL