串行化後的字符串如果被反串行化的變量是為了建立JavaScript對象,則成功恢復該對象的結構後,PHP將自動嘗試執行該對象的__wakeup()成員函數(如果其存在),屏蔽這個特性只需將其設為空即可。
在這個傳輸過程中,我們知道,實際上只能夠傳遞字符流,字符流是一維(扁平)的,然而很多對象卻是多維的,如果要傳遞的對象是一個字符串,那麼很簡單,我們直接將其作為傳遞的內容就可以了,如果要傳遞的對象是一個數組或者其他的結構呢,我們就需要用字符流來描述他,就比如在電話裡面,我問你的名字是什麼。
你會告訴我,你的名字是張三、李四,而我問你,你的長相如何呢,你就需要用文字向我描述了,我們進行數據傳遞的媒介往往和這條電話線路一樣,只能傳遞字符流,而我們描述對象的過程,實際上就是串行化的過程。
另外,串行化也可以用於對對象的持久化存儲,也許你曾經也和我一樣,想著在數據庫的某一個字段中存儲一個對象,現在我們可以非常簡單的做到這一點,並且,你的這個數據庫字段不需要設定為特殊格式,設定為varchar就可以了(當然,如果對象很大,你可能需要設定為text)。
好了,我想What和Why的問題你都了解了,本節最後我們來講點理論性強一些的內容,就是如何使用PHP串行化和反串行化數據,如何將JavaS
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()函數。
參數
即被串行化的表達式。serialize()處理除資源指針之外的所有類型,你甚至可以將含有指向自身元素的數組串行化。你串行化的含有循環指向的數組或者對象一樣會被存儲,其他的指向則會丟失。
當串行化對象時,PHP會嘗試首先調用其成員函數__sleep()。這將允許對象在被串行化之前進行諸如最後的清理工作等。同樣地,當使用unserialize()函數將對象恢復時,會調用成員建立JavaScript對象返回值返回一個可以被存儲在任何地點的包含對象的字節流表達式的字符串。