串列化可以把變數包括物件,轉換成連續bytes資料. 你可以將串列化後的變數存在一個檔案或在網路上傳輸. 然後再反串列化還原為原來的資料. 你在反串行化類別的物件之前定義的類別,PHP可以成功地儲存其物件的屬性和方法. 有時你可能需要一個物件在反串行化後立即執行. 為了這樣的目的,PHP會自動尋找__sleep和_ _wakeup方法.
當一個物件被串列化,PHP會呼叫__sleep方法(如果存在的話). 在反串列化一個物件後,PHP 會呼叫__wakeup方法. 這兩個方法都不接受參數. __sleep方法必須傳回一個陣列,包含需要串列化的屬性. PHP會拋棄其它屬性的值. 如果沒有__sleep方法,PHP將保存所有屬性.
範例6.16顯示如何用__sleep和__wakeup方法來串行化一個物件. Id屬性是一個不打算保留在物件中的臨時屬性. __sleep方法保證在串行化的物件中不包含id屬性. 當反串行化一個User物件,__wakeup方法建立id屬性的新值. 這個例子被設計成自我保持. 在實際開發中,你可能發現包含資源(如圖像或資料流)的物件需要這些方法.
Listing 6.16 Object serialization
class User
{
public $name;
public $id;
function __construct()
{
//give user a unique ID 給予一個不同的ID
$this->id = uniqid();
}
function __sleep()
{
//do not serialize this-> id 不串列化id
return(array("name"));
}
function __wakeup()
{
//give user a unique ID
$this->id = uniqid();
}
}
//create object 建立一個物件
$u = new User;
$u->name = " Leon";
//serialize it 串列化注意不串列化id屬性,id的值被拋棄
$s = serialize($u);
//unserialize it 反串列化id被重新賦值
$u2 = unserialize($s);
//$u and $u2 have different IDs $u和$u2有不同的ID
print_r ($u);
print_r($u2);
?>