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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php实现文件预览功能
May 23 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP使用pdo实现事务处理操作示例
Sep 05 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 PHP
Laravel实现批量更新多条数据
Apr 06 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中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
python关键字and和or用法实例
2015/05/28 Python
Python实现配置文件备份的方法
2015/07/30 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python3字符串操作总结
2019/07/24 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
个人自我鉴定
2013/11/07 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
研发工程师岗位职责
2014/04/28 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
警告通知
2015/04/25 职场文书
工程进度款催款函
2015/06/24 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
MySQL分区路径子分区再分区
2022/04/13 MySQL