浅谈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如何编写易读的代码
Jul 10 PHP
获取远程文件大小的php函数
Jan 11 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
网站用php实现paypal整合方法
Nov 28 PHP
PHP数组实例总结与说明
Aug 23 PHP
html静态页面调用php文件的方法
Nov 13 PHP
PHP实现的简单日历类
Nov 29 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
使用PHPExcel导出Excel表
Sep 08 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扩展图文教程
2008/12/12 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
php for 循环使用的简单实例
2016/06/02 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
企业行政文员岗位职责
2013/12/03 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
班主任寄语2016
2015/12/04 职场文书