2011-03-18 74 views
2

首先我讀過PHP手冊,我已經測試過了。 第二我還不明白它究竟做了什麼? 我爲什麼要序列化一個變量?PHP變量處理函數serialize()

+0

我有點得到它產生的類型和結構,例如s:12:「hello,world」; 但我爲什麼要使用它?以及我將使用哪些實例? – Aaron 2011-03-18 15:53:45

+4

http://en.wikipedia.org/wiki/Serialization – 2011-03-18 15:54:39

回答

5

你可能不希望序列化一個變量,但它對序列化對象和其他複雜的數據結構很有用。

不是創建一個帶有列加載的數據庫表,而是使用主鍵和blob創建一個表,並將一個類或數組序列化爲一個表。這樣你就擁有了一個非常靈活的系統,如果你需要添加新的數據到數據庫表中,你不需要添加更多的列。

這是一個愚蠢的例子,但如果你仔細想想,將對象持久化到數據庫中是非常有用的。

+0

這不是一個很好的例子,IMO。將數據作爲序列化字符串存儲在數據庫中意味着您無法對其使用正常的數據庫查詢。它偶爾有用,但它不是函數的主要用途。 – lonesomeday 2011-03-18 16:02:04

+0

這就是爲什麼我說它是一個愚蠢的例子,我發現它有助於將購物車對象序列化到數據庫中,以便他們的購物車可以很容易地被非序列化並被激活,生成發票或其他東西。 – 2011-03-18 16:05:44

0

它將變量寫入能夠被傳輸和存儲的形式。例如,您必須在將變量寫入文件,數據庫或將其存儲在HTTP會話中之前序列化變量

5

原因可能是將值存儲在文本文件或數據庫中。serialize()將非文本值轉換爲文本(例如二進制整數或浮點值),以便它們可以輕鬆地以此格式存儲,並輕鬆地使用unserialize()進行轉換...如果實際查看會話文件,這是存儲爲序列化字符串的$ _SESSION數組,可以在執行session_start()時輕鬆地將其轉換回$ _SESSION數組。

2

序列化單個變量沒有多大意義。它是有用得多序列化數組或對象:

$array = array(
    0 => 'hello', 
    1 => 'there', 
    'how' => 'are', 
    'you' => '?' 
); 

$txt = serialize($array); 
echo($txt); // 

產生

a:4:{i:0;s:5:"hello";i:1;s:5:"there";s:3:"how";s:3:"are";s:3:"you";s:1:"?";} 

你可以把文本字符串,它存儲在數據庫中,通過電子郵件發送它,將它填滿到一個文本文件等......然後再檢索它,並通過簡單的unserialize()調用將其重新轉換爲一個PHP數組。

+0

如何編碼一個序列化的對象並將其發送到遠程Web服務而不是json或xml,或者只是瘋狂? – 2011-03-18 16:07:26

+0

JSON和XML在支持方面遠爲普遍 - 我想不出任何直接支持Web的語言,或者有一個庫來添加支持。 PHP的序列化更具語言特定性。不是說你不能在Java或C#中使用這樣的字符串,但是由於你要使用跨語言,所以不妨使用更適合的類似XML/JSON的東西。 – 2011-03-18 16:12:18

+0

沒錯,只有在創建自己的分佈式系統而不是Web服務時纔有用。 – 2011-03-18 16:19:06

1

序列化變量意味着「將其轉換爲字符串」。基本上,它是一種將變量轉換爲可以輕鬆存儲以備將來使用的表單的方式。

想象一下這種情況:你有一個包含大量信息的數組。您需要將其存儲在文本文件中,以備下次需要時使用。默認情況下,將數組轉換爲字符串會導致意外的結果。例如,這樣做:

file_put_contents('file.txt', array('foo', 'bar')); 

將字符串foobar放入您的文本文件中。你不能輕易地將其轉換回數組中。 serialize數組將其轉換:

file_put_contents('file.txt', serialize(array('foo', 'bar'))); 
// a:2:{i:0;s:3:"foo";i:1;s:3:"bar";} 

這是不容易閱讀,但unserialize功能,可以將其轉換回陣列變得非常容易。

1

PHP中的serialize函數將數據結構轉換爲可存儲的字符串。序列化數據(例如變量,數組或對象)以存儲在數據庫或其他存儲位置。一旦反序列化,您可以在檢索後重復使用這些數據。這裏有一個例子:

$data = array("key"=>"value"); 
$serialized = serialize($data); 

// Shows the serialized string representing the array: 
// string(28) "a:1:{s:3:"key";s:5:"value";}" 
var_dump($serialized); 

$unserialized = unserialize($serialized); 

// Shows the original array named $data: 
// array(1) { ["key"]=> string(5) "value" } 
var_dump($unserialized);