在實際專案應用程式中,有些任務在一、兩個頁面是無法完成的,由於變數到腳本執行完畢就釋放,我們本頁所產生的物件想在其它頁面使用時便碰到了麻煩。
如果需要將物件及其方法傳遞到我們想使用物件的頁面,比較簡單可行的辦法是將物件序列化後儲存起來或直接傳送給所需的頁面,另一種方法是將物件註冊為session 變數。
物件序列化,就是將物件轉換成可以儲存的位元組流。當我們需要把一個物件在網路中傳輸時或要把物件寫入檔案或是資料庫時,就需要將物件進行序列化。
序列化完整過程包括兩個步驟:一個是序列化,就是把物件轉換為二進位的字串,serialize() 函數用來序列化一個物件;另一個是反序列化,就是把物件被序列轉換的二進位字串再轉換為對象,unserialize() 函數來反序列化一個被序列化的物件。這樣整個過程下來,物件內的型別結構及資料都是完整的。
語法:
string serialize( mixed value ) mixed unserialize( string str [, string callback] )
範例:
name = $name; $this->age = $age; } function say() { echo "我的名字叫:".$this->name." "; echo " 我的年龄是:".$this->age; } } $p1 = new Person("张三", 20); $p1_string = serialize($p1); //将对象序列化后写入文件 $fh = fopen("p1.text", "w"); fwrite($fh, $p1_string); fclose($fh); ?>
開啟p1.text 文件,裡面寫入的內容如下:
O:6:"Person":2:{s:12:" Person name";s:4:"张三";s:11:" Person age";i:20;}
但通常不會直接解析上述序列化所產生的字元。
反序列化:
name = $name; $this->age = $age; } function say() { echo "我的名字叫:".$this->name." "; echo " 我的年龄是:".$this->age; } } $p2 = unserialize(file_get_contents("p1.text")); $p2 -> say(); ?>
執行此例子,輸出:
我的名字叫:张三 我的年龄是:20
由於序列化物件無法序列化其方法,所以在unserialize 的時候,目前檔案必須包含對應的類別或require 對應的類別檔案。
序列化只能用於有限用戶的情況下,因為需要為每個用戶單獨儲存或寫入文件,並保證文件名不能重複。在使用者無法正常退出瀏覽器的情況下,無法保證檔案被刪除。
當使用者數量很多時,可以考慮用 session 來保存物件。關於 session 的更多信息,請參見《PHP Session》。
範例:
name = $name; $this->age = $age; } function say() { echo "我的名字叫:".$this->name." "; echo " 我的年龄是:".$this->age; } } $_SESSION["p1"] = new Person("张三", 20); ?>
讀取session :
name = $name; $this->age = $age; } function say() { echo "我的名字叫:".$this->name." "; echo " 我的年龄是:".$this->age; } } $_SESSION["p1"] -> say(); ?>
執行此例子,輸出:
我的名字叫:张三 我的年龄是:20
與序列化一樣,註冊物件為session 變數時並不能保存其方法,所以在讀取session 變數的時候,目前檔案必須包含對應的類別或require 對應的類別檔案。
以上是PHP 序列化 serialize物件的方法教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!