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
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 PHP
php使用crypt()函数进行加密
Jun 08 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
深入解析php模板技术原理【一】
2008/01/10 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
CentOS安装php v8js教程
2015/02/26 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
python绘制条形图方法代码详解
2017/12/19 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Python函数中不定长参数的写法
2019/02/13 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
创建市级文明单位实施方案
2014/03/01 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
四年级评语大全
2014/04/21 职场文书
考试作弊检讨书
2015/01/27 职场文书
休假证明书
2015/06/24 职场文书