php面向对象全攻略 (十六) 对象的串行化


Posted in PHP onSeptember 30, 2009

把对象串行化
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,
等到达另一端时,再还原为原来的对象,这个过程称之为串行化,就像我们现在想把一辆汽
车通过轮船运到美国去,因为汽车的体积比较大,我们可以把汽车拆开成小的部件,然后我们把这些部件通过轮般运到美国去,到了美国再把这些部件组装回汽车。
有两种情况我们必须把对象串行化,第一种情况就是把一个对象在网络中传输的时候要
将对象串行化,第二种情况就是把对象写入文件或是数据库的时候用到串行化。
串行化有两个过程,一个是串行化,就是把对象转化为二进制的字符串,我们使用
serialize()函数来串行化一个对象,另一个是反串行化,就是把对象转化的二进制字符串再转
化为对象, 我们使用unserialize()函数来反串行化一个对象。
PHP 中serialize()函数的参数为对象名,返回值为一个字符串,Serialize()返回的字符串
含义模糊,一般我们不会解析这个串来得到对象的信息,我们只要把返回来的这个字符串传
到网络另一端或是保存到方件中即可。
PHP 中unserialize()函数来反串行化对象,这个函数的参数即为serialize()函数的返回值,
输出当然是重新组织好的对象。代码片段

<? 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function __construct($name="", $sex="", $age=""){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
} 
$p1=new Person("张三", "男", 20); 
$p1_string=serialize($p1); //把一个对象串行化,返一个字符串 
echo $p1_string."<br>"; //串行化的字符串我们通常不去解析 
$p2=unserialize($p1_string); //把一个串行化的字符串反串行化形成对象$p2 
$p2->say(); 
?>

上例输出结果:
代码片段
O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}
我的名子叫:张三性别:男我的年龄是:20
在php5 中有两个魔术方法__sleep()方法和__wakeup()方法,在对象串行化的时候,会调用
一个__sleep()方法来完成一些睡前的事情;而在重新醒来,即由二进制串重新组成一个对象
的时候,则会自动调用PHP 的另一个函数__wakeup(),做一些对象醒来就要做的动作。
__sleep()函数不接受任何参数,但返回一个数组,其中包含需要串行化的属性。末被包
含的属性将在串行化时被忽略,如果没有__sleep()方法,PHP 将保存所有属性。
代码片段
<? 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function __construct($name="", $sex="", $age=""){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性function say() 
{ 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
//指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex 
function __sleep() { 
$arr=array("name", "age"); 
return($arr); 
} 
//重新生成对象时,并重新赋值$age为40 
function __wakeup() { 
$this->age = 40; 
} 
} 
$p1=new Person("张三", "男", 20); 
//把一个对象串行化,返一个字符串,调用了__sleep()方法,忽略没在数组中的属性$sex 
$p1_string=serialize($p1); 
echo $p1_string."<br>"; //串行化的字符串我们通常不去解析 
$p2=unserialize($p1_string); //反串行化形成对象$p2重新赋值$age为40 
$p2->say(); 
?>

上例输出值为:
执行结果
O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}
我的名子叫:张三性别:我的年龄是:40
PHP 相关文章推荐
PHP中路径问题的解决方案
Oct 09 PHP
论坛头像随机变换代码
Oct 09 PHP
漂亮但不安全的CTB
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 PHP
php面向对象全攻略 (十五) 多态的应用
Sep 30 #PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 #PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 #PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 #PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 #PHP
php面向对象全攻略 (九)访问类型
Sep 30 #PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 #PHP
You might like
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
python实现电脑自动关机
2018/06/20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python实现数值积分方式
2019/11/20 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
C语言开发工程师测试题
2016/12/20 面试题
推荐信格式范文
2014/05/09 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
安全温馨提示语大全
2015/07/14 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
如何做好工作总结!
2019/04/10 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript