中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> PHP编程 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
· PHP中类的理解和应用...
· PHP中类的理解和应用...
· 《PHP程序设计》 第...
· 在PHP中开发XML应用...
· 在PHP中开发XML应用...
· 在PHP中开发XML应用...
· 理解PHP中的MVC编程...
· PHP中的串行化变量和...
· PHP中实现图片的锐化...
· PHP中实现图片的锐化...
PHP中的串行化变量和序列化对象(2)
作者:不详  来源:不详  发布时间:2006-8-14 10:57:53  发布人:chinazhan

 减小字体 增大字体

     二、对象序列化
  
    对象的序列化也是一个比较普遍的功能,能够把一个对象进行串行化以后变成一个字符串,能够保存或者传输。
  
    我们先看一个例子:
  
  class TestClass
  {
   var $a;
   var $b;
  
   function TestClass()
   {
    $this->a = "This is a";
    $this->b = "This is b";
   }
  
   function getA()
   {
    return $this->a;
   }
  
   function getB()
   {
    return $this->b;
   }
  }
  
  $obj = new TestClass;
  $str = serialize($obj);
  echo $str;
  
    输出结果:
  
  O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b";}
  
    我们来分析一个对象串行化之后的字符串。
  
  O:9:"TestClass":2:
  {
   s:1:"a";s:9:"This is a";
   s:1:"b";s:9:"This is b";
  }
  
    首先看对于对象本身的内容:O:9:"TestClass":2:O是说明这是一个对象类型(object),然后9是代表对象的名字查过浓度,2是代表该对象有几个属性。在看两个属性的内容:
  
    s:1:"a";s:9:"This is a"; 其实跟数组的内容比较类似,第一项:s:1:"a"; 是描述属性名称的,第二项s:9:"This is a"; 是描述属性值的。后面的属性类似。
  
    先说一种对象序列化的应用,下面的内容是PHP手册上,没有更改原文。
  
    serialize() 返回一个字符串,包含着可以储存于 PHP 的任何值的字节流表示。unserialize() 可以用此字符串来重建原始的变量值。用序列化来保存对象可以保存对象中的所有变量。对象中的函数不会被保存,只有类的名称。
  
    要能够 unserialize() 一个对象,需要定义该对象的类。也就是,如果序列化了 page1.php 中类 A 的对象 $a,将得到一个指向类 A 的字符串并包含有所有 $a 中变量的值。如果要在 page2.php 中将其解序列化,重建类 A 的对象 $a,则 page2.php 中必须要出现类 A 的定义。这可以例如这样实现,将类 A 的定义放在一个包含文件中,并在 page1.php 和 page2.php 都包含此文件。
  
  <?php
  // classa.inc:
  class A
  {
   var $one = 1;
  
   function show_one()
   {
    echo $this->one;
   }
  }
  
  // page1.php:
  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // 将 $s 存放在某处使 page2.php 能够找到
  $fp = fopen("store", "w");
  fputs($fp, $s);
  fclose($fp);
  
  // page2.php:
  // 为了正常解序列化需要这一行
  include("classa.inc");
  
  $s = implode("", @file("store"));
  $a = unserialize($s);
  
  // 现在可以用 $a 对象的 show_one() 函数了
  $a->show_one();
  ?>
  
    如果在用会话并使用了 session_reGISter() 来注册对象,这些对象会在每个 PHP 页面结束时被自动序列化,并在接下来的每个页面中自动解序列化。基本上是说这些对象一旦成为会话的一部分,就能在任何页面中出现。
  
    强烈建议在所有的页面中都包括这些注册的对象的类的定义,即使并不是在所有的页面中都用到了这些类。如果没有这样做,一个对象被解序列化了但却没有其类的定义,它将失去与之关联的类并成为 stdClass 的一个对象而完全没有任何可用的函数,这样就很没有用处。
  
    因此如果在以上的例子中 $a 通过运行 session_register("a") 成为了会话的一部分,应该在所有的页面中包含 classa.inc 文件,而不只是page1.php 和 page2.php
  
    当然,其实序列化对象其实完全可以应用在很多地方。当然,在PHP 5中对序列化的处理不一样了,我们看一下手册中的说法:
  
    serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
  
    使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
  
    相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
  
    使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。  做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。

 
[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .