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