一、在会话中存放对象
在 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() 也能够让你仅序列化对象的某些属性。