原文串連:http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html
總目錄
What 、Why、How
What
Why
How
PHP序列化文法
PHP序列化執行個體
在JavaScript中序列化為JSON—使用json2.js
在JavaScript中序列化為JSON—使用prototype.js
PHP與JSON
json_decode函數
json_encode函數
json_decode函數執行個體
json_encode函數執行個體
實踐出真知
背景說明
前台JavaScript部分
後台PHP部分
What 、Why、How
What
Ok,各位親愛的朋友,讓我們開始這個新概念的旅程,序列化這個話題可能大家以前都沒有多加關注,事情其實起源於那天我隨便翻翻PHP手冊,發現這個序列化的函數,之後閑來無聊又做一個WordPress的外掛程式,這個時候順便用了一下序列化,發現在某些場合的確非常方便。
先來解釋下序列化:簡單來說,序列化即將變數轉換成位元組流的過程。序列化的提出,有效解決了對象的儲存和傳輸的問題,舉例來說,我在JavaScript 中建立了一個對象,我現在想將這個對象儲存到伺服器端的資料庫中,那麼我如何進行操作呢,這個時候往往就用到了對象的序列化。在JavaScript的序列化中不得不提JSON,JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫,同時也易於機器解析和產生。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式設定,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。
人們通常將JSON和XML進行比較,二者都是將對象扁平化(稍後我們解釋這個“扁平化”)的一種手段,XML的特點是結構嚴謹,而JSON的特點則是簡單易讀、容易使用程式進行分析,因為它能夠很簡單的將一個對象轉換為一個字元流的形式,例如如下代碼:
代碼:
{"type":"human","name":"hanguofeng","age":22}
則是一個JSON運算式,他儲存了一個對象,我們如何將它恢複為對象呢?很簡單,如下:
代碼:
var animal_str = {"type":"human","name":"hanguofeng","age":22};
var animal2=eval(( + animal_str + ));
我們通過JavaScript的求值函數,將JSON運算式進行運算,並傳回值,用以獲得一個對象,到這裡,我想你一定會和我一樣,對JSON格式的創造者的思維佩服不已吧。本來說講序列化的,“不小心”談到JSON,並且講了這麼多,呵呵,跑題了嗎?沒有,PHP的序列化和JSON是非常像的,一個PHP的序列化運算式如下:
代碼:
a:3:{s:4:"type";s:5:"human";s:4:"name";s:10:"hanguofeng";s:3:"age";s:2:"20";}
他看起來結構和JSON有些類似,實際上,這個運算式是如下數組的序列化結果:
代碼:
$animal =
array
(
"type" => "human",
"name" => "hanguofeng",
"age" => "20"
);
OK,上面的一些介紹只是讓你大致看到序列化和JSON是什麼樣的東西,你無須對這裡的代碼過分糾結,我們在後面會詳細講解的,下面我們來談談為什麼要使用序列化。
Why
序列化首先是作為資料轉送的方便而出現的,正如本文開始我提出的問題,我在JavaScript中建立了一個對象,我現在想將這個對象儲存到伺服器端的資料庫中,應該如何做,這其實上是一個“我如何將一個對象從瀏覽器提交到伺服器”的問題,在這個傳輸過程中,我們知道,實際上只能夠傳遞字元流,字元流是一維(扁平)的,然而很多個物件卻是多維的,如果要傳遞的對象是一個字串,那麼很簡單,我們直接將其作為傳遞的內容就可以了,如果要傳遞的對象是一個數組或者其他的結構呢,我們就需要用字元流來描述他,就比如在電話裡面,我問你的名字是什麼,你會告訴我,你的名字是張三、李四,而我問你,你的長相如何呢,你就需要用文字向我描述了,我們進行資料傳遞的媒介往往和這條電話線路一樣,只能傳遞字元流,而我們描述對象的過程,實際上就是序列化的過程。
另外,序列化也可以用於對對象的持久化儲存,也許你曾經也和我一樣,想著在資料庫的某一個欄位中儲存一個對象,現在我們可以非常簡單的做到這一點,並且,你的這個資料庫欄位不需要設定為特殊格式,設定為 varchar就可以了(當然,如果對象很大,你可能需要設定為text)。
How
PHP序列化文法
好了,我想What和Why的問題你都瞭解了,本節最後我們來講點理論性強一些的內容,就是如何使用PHP序列化和反序列化資料,如何將JavaScript對象序列化(即變為JSON格式)和如何將其反序列化,最後則是如何將JSON和PHP的序列化建立關係。
PHP為我們提供了兩個函數,用來進行序列化和反序列化的操作,這兩個函數分別是:serialize()和unserialize(),他們適用於PHP4和PHP5,下面分別進行講解:
serialize()
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)
serialize — 獲得一個可儲存的表述值
說明
string serialize ( mixed $value )
獲得一個可儲存的表述值
本函數用於無損的儲存或者傳遞PHP變數值和結構。
如果需要將已經序列化的值轉回PHP變數,可以使用unserialize()函數。
參數
value
即被序列化的運算式。serialize()處理除資源指標之外的所有類型,你甚至可以將含有指向自身元素的數組序列化。你序列化的含有迴圈指向的數組或者對象一樣會被儲存,其他的指向則會丟失。
當序列化對象時,PHP會嘗試首先調用其成員函數__sleep()。這將允許對象在被序列化之前進行諸如最後的清理工作等。同樣地,當使用unserialize()函數將對象恢複時,會調用成員函數__wakeup()。
傳回值
返回一個可以被儲存在任何地點的包含對象的位元組流運算式的字串。
unserialize()
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)
unserialize — 從一個已儲存的運算式中獲得一個PHP變數值
說明
mixed unserialize ( string $str )
unserialize()擷取一個簡單類型的序列化變數並將其轉換回PHP變數值。
參數
str
序列化後的字串
如果被反序列化的變數是一個對象,則成功恢複該對象的結構後,PHP將自動嘗試執行該對象的__wakeup()成員函數(如果其存在)。
unserialize_callback_func 指令:你可以設定在此過程中唄執行的回呼函數,如果某個未被定義的類應當在反序列化時被執行個體化(以避免獲得一個不完全的對象 “__PHP_Incomplete_Class”)。你可以使用php.ini,ini_set()或者.htaccess來定義 “unserialize_callback_func”。當一個未被定義的類被執行個體化時,它會被調用。屏蔽這個特性只需將其設為空白即可。
傳回值
返迴轉換後的數值,可能是布爾變數、實數、浮點數、字串、數組或者對象。
假如傳入的字串不可以被反序列化,則返回FALSE,同時拋出NOTICE錯誤。
(以上譯自PHP手冊)
PHP序列化執行個體
數組的序列化和反序列化
OK,讓我們來用執行個體學習一下,首先,請建立sample1.php檔案,我們在這個檔案中用如下語句來建立一個雜湊數組:
代碼:
$animal =
array
(
"type" => "human",
"name" => "hanguofeng",
"age" => "20"
);
?>
為了測試這個數組的值,你可以使用print_r()函數來輸出數組,輸出的結果如下:
代碼:
Array
(
[type] => human
[name] => hanguofeng
[age] => 20
)
那麼我們將他來序列化一下,序列化的代碼如下:
代碼:
$animal =
array
(
"type" => "human",
"name" => "hanguofeng",
"age" => "20"
);
$animal_ser=serialize($animal);
echo($animal_ser);
?>
這裡我們將數組$animal序列化,將返回的序列化字串儲存在變數$animal_ser中,並輸出,輸出的結果是:
代碼:
a:3:{s:4:"type";s:5:"human";s:4:"name";s:10:"hanguofeng";s:3:"age";s:2:"20";}
我們來簡單對這個字串進行一個解析:
a:3表示這是一個數組型的對象(a),他共有三個內建的對象(3)
大括弧裡面的部分是以逗號分割的對象運算式列表,以s:4:"type"為例,他表示一個字串(s),長度為4位(4),值為“type”,即雜湊數組的第一個元素的鍵。
後面的部分以此類推,我們不再贅述,你可以試試自己將各種對象序列化,看看序列化後的字串是如何構建的。
下面來看數組的反序列化,即將我們上面產生的序列化字串恢複為數組,代碼如下:
代碼:
$animal_ser=a:3:{s:4:"type";s:5:"human";s:4:"name";s:10:"hanguofeng";s:3:"age";s:2:"20";};<
http://www.bkjia.com/PHPjc/486569.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/486569.htmlTechArticle原文串連:http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html 總目錄 What 、Why、How What Why How PHP序列化文法 PHP序列化執行個體 在JavaScript中串...