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在Apache下的两种模式的安装
Sep 05 PHP
php中的一个中文字符串截取函数
Feb 14 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
php实现的在线人员函数库
Apr 09 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
php时间戳转换代码详解
Aug 04 PHP
php下的原生ajax请求用法实例分析
Feb 28 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中的null合并运算符
2015/12/30 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
javascript轮播图算法
2016/10/21 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
python负载均衡的简单实现方法
2018/02/04 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
实习老师个人总结的自我评价
2013/09/28 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
银行员工考核评语
2014/12/31 职场文书
颐和园英文导游词
2015/01/30 职场文书
运动会新闻报道稿
2015/07/22 职场文书