浅谈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 删除数组元素
Jan 16 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP数组访问常用方法解析
Sep 05 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代码
2012/09/14 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
js parsefloat parseint 转换函数
2010/01/21 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
python实现排序算法
2014/02/14 Python
Python使用minidom读写xml的方法
2015/06/03 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
经济管理专业自荐信
2013/12/30 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
护理医院见习报告
2014/11/03 职场文书
小浪底导游词
2015/02/12 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js