加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入认识PHP中的序列化和反序列化

发布时间:2022-07-19 14:57:17 所属栏目:PHP教程 来源:互联网
导读:序列化 序列化格式 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。 序列化函数原型如下: class CC { public $data; private $pass; public function __construct($data, $pass) { $this-data = $data; $this-pass = $pass; } }
  序列化
  序列化格式
  在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。
 
  序列化函数原型如下:
 
  
 
 
  class CC {
 
      public $data;
 
      private $pass;
 
   
 
      public function __construct($data, $pass)
 
      {
 
          $this->data = $data;
 
          $this->pass = $pass;
 
      }
 
  }
 
  $number = 34;
 
  $str = 'uusama';
 
  $bool = true;
 
  $null = NULL;
 
  $arr = array('a' => 1, 'b' => 2);
 
  $cc = new CC('uu', true);
 
   
 
  var_dump(serialize($number));
 
  var_dump(serialize($str));
 
  var_dump(serialize($bool));
 
  var_dump(serialize($null));
 
  var_dump(serialize($arr));
 
  var_dump(serialize($cc));
 
  输出结果为:
 
  
  string(5) "i:34;"
 
  string(13) "s:6:"uusama";"
   Null : N;
  Array : a:size:{key definition;value definition;(repeated per element)}
  Object : O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}
  序列化对象
  从上面的例子中我们可以看出序列化对象的时候,只会保存属性值。
 
  那么对象中的常量会不会保存呢?
  如果是继承,父类的变量会不会保存呢
 
 
 
  
 
 
 
  class CB {
 
      public $CB_data = 'cb';
 
  }
  
   
 
      public function __construct($data, $pass)
 
      {
 
          $this->data = $data;
  
   
 
  var_dump(serialize($cc));
 
  输出结果为:
 
 
  string(75) "O:2:"CC":3:{s:4:"data";s:2:"uu";s:8:" CC pass";b:1;s:7:"CB_data";s:2:"cb";}"
 
  显然,序列化对象时,不会保存常量的值。对于父类中的变量,则会保留。
 
  对象序列化自定义
  在序列化对象的时候,对于对象中的一些敏感属性,我们不需要保存,这又该如何处理呢?
 
  当调用serialize()函数序列化对象时,该函数会检查类中是否存在一个魔术方法__sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。可以通过重载这个方法,从而自定义序列化行为。该方法原型如下:
 
 
  public array __sleep ( void )
 
  该方法返回一个包含对象中所有应被序列化的变量名称的数组
  该方法未返回任何内容,则 NULL 被序列化,并产生一个E_NOTICE级别的错误
  __sleep()不能返回父类的私有成员的名字。这样做会产生一个E_NOTICE级别的错误。这时只能用Serializable接口来替代。
  常用于保存那些大对象时的清理工作,避免保存过多冗余数据

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读