變數|對象 序列化大概就是把一些變數轉化成為字串的位元組流的形式,這樣比較容易傳輸、儲存。當然,關是傳輸儲存沒有什麼,關鍵是變成串的形式以後還能夠轉化回來,而且能夠保持原來資料的結構。
在PHP中有多序列化處理的函數:serialize(),該函數把任何變數值(除了資源變數)轉化為字串的形式,可以把字串儲存到檔案裡,或者註冊為Session,乃至於使用curl來類比GET/POST來傳輸變數,達到RPC的效果。
如果要將序列化的變數轉化成PHP原始的變數值,那麼可以使用unserialize()函數。
一、變數序列化
我們舉簡單的例子來說明序列化,以及它的儲存格式。
整型:
$var = 23;
echo serialize($var);
輸出:
i:23;
浮點型:
$var = 1.23;
echo serialize($var);
輸出:
d:1.229999999999999982236431605997495353221893310546875;
字串:
$var = "This is a string";
echo serialize($var);
$var = "我是變數";
echo serialize($var);
輸出:
s:16:"This is a string";
s:8:"我是變數";
布爾型:
$var = true;
echo serialize($var);
$var = false;
echo serialize($var);
輸出:
b:1;
b:0;
上面這些基本類型序列化之後的情況很清楚,序列化之後的儲存格式是:
變數類型:[變數長度:]變數值;
就是第一位字元代表變數類型,第二個:代表分割,變數長度是可選的,就是在字串類型裡有,其他類型沒有,最後一個就是變數值,每個序列化的值以";"作為結束。
比如我們整型數字23序列化之後就是:i:23,那麼它沒有長度,只有類型和變數值,i代表integer,通過冒號分割,後面儲存的是整型值23,包括浮點型(雙位元組型)也是一樣。布爾型的話,類型是b(boolean),如果是true的話,那麼序列化的值是1,如果是false那麼值就是0。字
符串值話中間會多一個儲存的值得,儲存字串的長度值,比如字串"This is a string",那麼產生的序列化的值是 s:16:"This is a string"; s是string,代表類型,中間的16就是該字串的長度,如果是中文的話,那麼每個中文是兩個字元來儲存的,比如字串 "我是變數",產生的序列化值是:s:8:"我是變數"; 就是8個字元的長度。
下面我們重點來講一下陣列變數序列化。
陣列變數:
$var = array("abc", "def", "xyz", "123");
echo serialize($var);
輸出:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz";i:3;s:3:"123";}
就是把我的數組 $var 序列化得到的字串值,我們的$var數組包括4個字串元素,分別是"abc", "def", "xyz", "123",我們來分析一下序列化後的資料,為了簡便起見,我們把序列化的資料列成數組的樣式:
a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}
這樣排列就比較清晰了,看開始的字串:a:4:{...} 首先第一個字元a儲存的是變數類型是array(數組)類型,第二個 4 儲存的是數組元素的個數,一共有4個,然後在{}之間數組元素的內容。比如第一個數組元素:i:0;s:3:"abc"; i代表是當前數組元素的索引實值型別是整型,並且值是 0,元素值的類型是s(字串的),個數是 3 個,具體值是"abc",分號結束,下面的數組元素依次類推。
我們再看看使用字串做為元素索引會如何:
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4"=>"123");
echo serialize($var);
輸出:
a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6:"index3";s:3:"xyz";s:6:"index4";s:3:"123";}
變成數組樣式後:
a:4:
{
s:6:"index1";s:3:"abc";
s:6:"index2";s:3:"def";
s:6:"index3";s:3:"xyz";
s:6:"index4";s:3:"123";
}
其實跟上面沒有太大區別,不過是開始的索引變成了儲存字串的形式,比如第一個元素:s:6:"index1";s:3:"abc";第一項就是索引值:s:6:"index1"; s是類型,6是索引字串的長度,"index1"就是索引的值。後面的s:3:"abc"; 就是元素值,這個好理解,就不講了。
從上面來看,我們大致瞭解了基礎資料型別 (Elementary Data Type)的序列化,其實我們完全可以構造自己的序列化功能,或者從這個角度去擴充,開發自己的序列化程式,便於我們的變數交換。
當然,其實我們也可以利用這個功能,把數組或者任意其他變數序列化成字串,然後通過curl功能來類比GET/POST功能,達到能夠無用使用者執行動作就從遠程伺服器擷取資料的功能。
[1] [2] 下一頁