對象序列化

序列化對象 - 在會話中存放對象

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

為了能夠unserialize()一個對象,這個對象的類必須已經(jīng)定義過。如果序列化類A的一個對象,將會返回一個跟類A相關(guān),而且包含了對象所有變量值的字符串。 如果要想在另外一個文件中反序列化一個對象,這個對象的類必須在反序列化之前定義,可以通過包含一個定義該類的文件或使用函數(shù)spl_autoload_register()來實現(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保存起來以便文件page2.php能夠讀到
  
file_put_contents('store'$s);

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

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

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

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

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

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