所有php里面的值都可以使用函數(shù)serialize()來返回一個包含字節(jié)流的字符串來表示。unserialize()函數(shù)能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。
為了能夠unserialize()一個對象,這個對象的類必須已經(jīng)定義過。如果序列化類A的一個對象,將會返回一個跟類A相關(guān),而且包含了對象所有變量值的字符串。 如果要想在另外一個文件中反序列化一個對象,這個對象的類必須在反序列化之前定義,可以通過包含一個定義該類的文件或使用函數(shù)spl_autoload_register()來實(shí)現(xiàn)。
<?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);
// 現(xiàn)在可以使用對象$a里面的函數(shù) show_one()
$a->show_one();
?>
在應(yīng)用程序中序列化對象以便在之后使用,強(qiáng)烈推薦在整個應(yīng)用程序都包含對象的類的定義。 不然有可能出現(xiàn)在反序列化對象的時候,沒有找到該對象的類的定義,從而把沒有方法的類__PHP_Incomplete_Class_Name作為該對象的類,導(dǎo)致返回一個沒有用的對象。
所以在上面的例子中,當(dāng)運(yùn)行session_register("a")
,把變量$a放在會話里之后,需要在每個頁面都包含文件classa.inc
,而不是只有文件page1.php和page2.php。
除了以上建議,可以在對象上使用 __sleep() 和 __wakeup() 方法對序列化/反序列化事件掛載鉤子。 使用 __sleep() 也能夠讓你僅序列化對象的某些屬性。