serialize()和unserialize()在php手冊上的解釋是:
serialize — Generates a storable representation of a value,產生一個可存儲的值的表示。
unserialize — Creates a PHP value from a stored representation,從已存儲的表示中創建 PHP 的值。
serialize() 返回字符串,此字符串包含了表示 value 的字節流,可以存儲於任何地方。這有利於存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
想要將已序列化的字符串變回 PHP 的值,可使用 unserialize() 。 serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數組。你正 serialize() 的數組/對象中的引用也將被存儲。
當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數 __sleep() 。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 __wakeup() 成員函數。
下面我們試一下這個函數的使用方法:
<?php //聲明一個類 class dog { var $name; var $age; var $owner; function dog($in_name="unnamed", $in_age="0", $in_owner="unknown") { $this->name = $in_name; $this->age = $in_age; $this->owner = $in_owner; } function getage() { return ($this->age * 365); } function getowner() { return ($this->owner); } function getname() { return ($this->name); } } //實例化這個類 $ourfirstdog = new dog("Rover",12,"Lisa and Graham"); //用serialize函數將這個實例轉化為一個序列化的字符串 $dogdisc = serialize($ourfirstdog); print $dogdisc; //$ourfirstdog 已經序列化為字符串 O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"Lisa and Graham";} print '<br />'; /* ----------------------------------------------------------------------------------------- 在這裡你可以將字符串 $dogdisc 存儲到任何地方如 session,cookie,數據庫,php文件 ----------------------------------------------------------------------------------------- */ //我們在此注銷這個類 unset($ourfirstdog); /* 還原操作 */ /* ----------------------------------------------------------------------------------------- 在這裡將字符串 $dogdisc 從你存儲的地方讀出來如 session,cookie,數據庫,php文件 ----------------------------------------------------------------------------------------- */ //我們在這裡用 unserialize() 還原已經序列化的對象 $pet = unserialize($dogdisc); //此時的 $pet 已經是前面的 $ourfirstdog 對象了 //獲得年齡和名字屬性 $old = $pet->getage(); $name = $pet->getname(); //這個類此時無需實例化可以繼續使用,而且屬性和值都是保持在序列化之前的狀態 print "Our first dog is called $name and is $old days old<br />"; print '<br />'; ?>
官方的一個程序例子:
<?php // $session_data 是包含了當前用戶 session 信息的多維數組。 // 我們使用 serialize() 在請求結束之前將其存儲到數據庫中。 $conn = odbc_connect ( "webdb" , "php" , "chicken" ); $stmt = odbc_prepare ( $conn , "UPDATE sessions SET data = ? WHERE id = ?" ); $sqldata = array ( serialize ( $session_data ), $PHP_AUTH_USER ); if (! odbc_execute ( $stmt , & $sqldata )) { $stmt = odbc_prepare ( $conn , "INSERT INTO sessions (id, data) VALUES(?, ?)" ); if (! odbc_execute ( $stmt , & $sqldata )) { /* 出錯 */ } } ?>