PHP教程

PHP对象序列化

一、在会话中存放对象

在 PHP 中,可以使用serialize()函数将一个值序列化为一个包含字节流的字符串表示。这个字符串可以用unserialize()函数来还原为原始的 PHP 值。当序列化一个对象时,会保存对象的所有变量的值,但不会保存对象的方法,只会保存类的名字。

要成功地使用unserialize()函数来反序列化一个对象,必须先定义该对象所属的类。如果要在另一个文件中反序列化一个对象,那么在反序列化之前,需要确保该类已经被定义。可以通过包含定义该类的文件或使用spl_autoload_register()函数来实现自动加载类的定义。

二、实例

<?php
// classa.inc:
  
  class A {
      public $one = 1;
    
      public function show_one() {
          echo $this->one;
      }
  }
  
// page1.php:

  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // 把变量$s保存起来以便文件page2.php能够读到
  file_put_contents('store', $s);

// page2.php:
  
  // 要正确反序列化,必须包含下面一个文件
  include("classa.inc");

  $s = file_get_contents('store');
  $a = unserialize($s);

  // 现在可以使用对象$a里面的函数 show_one()
  $a->show_one();
?>

在应用程序中序列化对象以便在之后使用,强烈推荐在整个应用程序都包含对象的类的定义。 不然有可能出现在反序列化对象的时候,没有找到该对象的类的定义,从而把没有方法的类 __PHP_Incomplete_Class_Name 作为该对象的类,导致返回一个没有用的对象。

所以在上面的例子中,通过在 $_SESSION 超全局数组中添加新的键,把变量 $a 放在会话里之后,需要在每个页面都包含文件 classa.inc, 而不是只有文件 page1.php 和 page2.php。

除了以上建议,可以在对象上使用 __sleep() 和 __wakeup() 方法对序列化/反序列化事件挂载钩子。 使用 __sleep() 也能够让你仅序列化对象的某些属性。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录