對(duì)象序列化

序列化對(duì)象 - 在會(huì)話中存放對(duì)象

所有php里面的值都可以使用函數(shù)serialize()來(lái)返回一個(gè)包含字節(jié)流的字符串來(lái)表示。unserialize()函數(shù)能夠重新把字符串變回php原來(lái)的值。 序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類的名字。

為了能夠unserialize()一個(gè)對(duì)象,這個(gè)對(duì)象的類必須已經(jīng)定義過。如果序列化類A的一個(gè)對(duì)象,將會(huì)返回一個(gè)跟類A相關(guān),而且包含了對(duì)象所有變量值的字符串。 如果要想在另外一個(gè)文件中反序列化一個(gè)對(duì)象,這個(gè)對(duì)象的類必須在反序列化之前定義,可以通過包含一個(gè)定義該類的文件或使用函數(shù)spl_autoload_register()來(lái)實(shí)現(xiàn)。

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

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// 把變量$s保存起來(lái)以便文件page2.php能夠讀到
  
file_put_contents('store'$s);

// page2.php:
  
  // 要正確反序列化,必須包含下面一個(gè)文件
  
include("classa.inc");

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

  
// 現(xiàn)在可以使用對(duì)象$a里面的函數(shù) show_one()
  
$a->show_one();
?>

在應(yīng)用程序中序列化對(duì)象以便在之后使用,強(qiáng)烈推薦在整個(gè)應(yīng)用程序都包含對(duì)象的類的定義。 不然有可能出現(xiàn)在反序列化對(duì)象的時(shí)候,沒有找到該對(duì)象的類的定義,從而把沒有方法的類__PHP_Incomplete_Class_Name作為該對(duì)象的類,導(dǎo)致返回一個(gè)沒有用的對(duì)象。

所以在上面的例子中,當(dāng)運(yùn)行session_register("a"),把變量$a放在會(huì)話里之后,需要在每個(gè)頁(yè)面都包含文件classa.inc,而不是只有文件page1.phppage2.php。

除了以上建議,可以在對(duì)象上使用 __sleep()__wakeup() 方法對(duì)序列化/反序列化事件掛載鉤子。 使用 __sleep() 也能夠讓你僅序列化對(duì)象的某些屬性。