十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
序列化是將變量轉(zhuǎn)換為可保存或傳輸?shù)淖址倪^(guò)程;反序列化就是在適當(dāng)?shù)臅r(shí)候把這個(gè)字符串再轉(zhuǎn)化成原來(lái)的變量使用。這兩個(gè)過(guò)程結(jié)合起來(lái),可以輕松地存儲(chǔ)和傳輸數(shù)據(jù),使程序更具維護(hù)性。

成都創(chuàng)新互聯(lián)長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為汾陽(yáng)企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),汾陽(yáng)網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
PHP中的序列化和反序列化分別通過(guò)函數(shù)serialize()和unserialize()即可實(shí)現(xiàn)。serialize()的參數(shù)可以是resource類型外的所有變量類型,最常見(jiàn)的是用來(lái)序列化對(duì)象,unseialize()將serialize的返回結(jié)果作為參數(shù),進(jìn)行反序列化,得到原對(duì)象。
把復(fù)雜的數(shù)據(jù)類型壓縮到一個(gè)字符串中
serialize() 把變量和它們的值編碼成文本形式
unserialize() 恢復(fù)原先變量
eg:
結(jié)果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] = Moe [1] = Larry [2] = Curly )
當(dāng)把這些序列化的數(shù)據(jù)放在URL中在頁(yè)面之間會(huì)傳遞時(shí),需要對(duì)這些數(shù)據(jù)調(diào)用urlencode(),以確保在其中的URL元字符進(jìn)行處理:
margic_quotes_gpc和magic_quotes_runtime配置項(xiàng)的設(shè)置會(huì)影響傳遞到unserialize()中的數(shù)據(jù)。
如果magic_quotes_gpc項(xiàng)是啟用的,那么在URL、POST變量以及cookies中傳遞的數(shù)據(jù)在反序列化之前必須用stripslashes()進(jìn)行處理:
如果magic_quotes_runtime是啟用的,那么在向文件中寫(xiě)入序列化的數(shù)據(jù)之前必須用addslashes()進(jìn)行處理,而在讀取它們之前則必須用stripslashes()進(jìn)行處理:
當(dāng)對(duì)一個(gè)對(duì)象進(jìn)行反序列化操作時(shí),PHP會(huì)自動(dòng)地調(diào)用其__wakeUp()方法。這樣就使得對(duì)象能夠重新建立起序列化時(shí)未能保留的各種狀態(tài)。例如:數(shù)據(jù)庫(kù)連接等。
1、首先創(chuàng)建好一個(gè)數(shù)組然后序列化,array("table" = member, "field" = 1,"rule" = -0 ,"cycle" = 24 ,"max" = 1 )。
2、然后用serilize函數(shù)序列號(hào),接著在打印輸出看序列化的結(jié)果。
3、結(jié)果{s:5:"table";s:6:"member";s:5:"field";i:1;s:4:"rule";i:0;s:5:"cycle";i:24;s:3:"max";i:},a:后代表是個(gè)數(shù),s:后代表是字符串長(zhǎng)度,i:是數(shù)字長(zhǎng)度。
4、然后將序列化字符串,輸入到mysql數(shù)據(jù)庫(kù)中以備使用。
5、最后將反序列化的結(jié)果打印,會(huì)顯示出一個(gè)數(shù)組,就完成了。
mixed unserialize ( string str [, string callback] )
unserialize() 對(duì)單一的已序列化的變量進(jìn)行操作,將其轉(zhuǎn)換回 PHP 的值。返回的是轉(zhuǎn)換之后的值,可為 integer、float、string、array 或 object。如果傳遞的字符串不可解序列化,則返回 FALSE。
unserialize_callback_func 指令: 如果在解序列化的時(shí)候需要實(shí)例化一個(gè)未定義類,則可以設(shè)置回調(diào)函數(shù)以供調(diào)用(以免得到的是不完整的 object “__PHP_Incomplete_Class”)??赏ㄟ^(guò) php.ini、ini_set() 或 .htaccess 定義‘unserialize_callback_func’。每次實(shí)例化一個(gè)未定義類時(shí)它都會(huì)被調(diào)用。若要禁止這個(gè)特性,只需置空此設(shè)定。還需要注意的是 unserialize_callback_func 指令是從 PHP 4.2.0 開(kāi)始提供使用的。
若被解序列化的變量是一個(gè)對(duì)象,在成功地重新構(gòu)造對(duì)象之后,PHP 會(huì)自動(dòng)地試圖去調(diào)用 __wakeup() 成員函數(shù)(如果存在的話)。 例子 1. unserialize_callback_func 示例
?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
// unserialize_callback_func 從 PHP 4.2.0 起可用
ini_set('unserialize_callback_func','mycallback'); // 設(shè)置您的回調(diào)函數(shù)
function mycallback($classname) {
// 只需包含含有類定義的文件
// $classname 指出需要的是哪一個(gè)類
}
?
?php
// 這里,我們使用 unserialize() 裝載來(lái)自數(shù)據(jù)庫(kù)的 $session_data 數(shù)組中的會(huì)話數(shù)據(jù)。
// 此例是描述 serialize() 的那個(gè)例子的補(bǔ)充。
$conn = odbc_connect ("webdb", "php", "chicken");
$stmt = odbc_prepare ($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array ($PHP_AUTH_USER);
if (!odbc_execute ($stmt, $sqldata) || !odbc_fetch_into ($stmt, $tmp)) {
// 如果執(zhí)行出錯(cuò)或返回錯(cuò)誤,則初始化為空數(shù)組
$session_data = array();
} else {
// 現(xiàn)在我們需要的是 $tmp[0] 中已序列化的數(shù)據(jù)。
$session_data = unserialize ($tmp[0]);
if (!is_array ($session_data)) {
// 出錯(cuò),初始化為空數(shù)組
$session_data = array();
}
}
?
在PHP中,序列化用于存儲(chǔ)或傳遞 PHP 的值的過(guò)程中,同時(shí)不丟失其類型和結(jié)構(gòu)。本文講述PHP序列化的四種方案,感興趣的可以了解一下
序列化是將變量轉(zhuǎn)換為可保存或傳輸?shù)淖址倪^(guò)程;反序列化就是在適當(dāng)?shù)臅r(shí)候把這個(gè)字符串再轉(zhuǎn)化成原來(lái)的變量使用。這兩個(gè)過(guò)程結(jié)合起來(lái),可以輕松地存儲(chǔ)和傳輸數(shù)據(jù),使程序更具維護(hù)性。
1、什么是PHP序列化——serialize和unserialize函數(shù)
這兩個(gè)是序列化和反序列化PHP中數(shù)據(jù)的常用函數(shù)。
$a = array('a' = 'Apple' ,'b' = 'banana' , 'c' = 'Coconut');
//序列化數(shù)組$s = serialize($a);echo $s;//輸出結(jié)果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo ''
;
//反序列化$o = unserialize($s);
print_r($o);
當(dāng)數(shù)組值包含如雙引號(hào)、單引號(hào)或冒號(hào)等字符時(shí),它們被反序列化后,可能會(huì)出現(xiàn)問(wèn)題。為了克服這個(gè)問(wèn)題,一個(gè)巧妙的技巧是使用base64_encode和base64_decode。
$obj = array();//序列化$s = base64_encode(serialize($obj)); //反序列化$original = unserialize(base64_decode($s));
但是base64編碼將增加字符串的長(zhǎng)度。為了克服這個(gè)問(wèn)題,可以和gzcompress一起使用。
//定義一個(gè)用來(lái)序列化對(duì)象的函數(shù)
function my_serialize( $obj ) { return base64_encode(gzcompress(serialize($obj))); }
//反序列化function my_unserialize($txt) { return unserialize(gzuncompress(base64_decode($txt))); }
2、什么是PHP序列化——json_encode 和 json_decode
使用JSON格式序列化和反序列化是一個(gè)不錯(cuò)的選擇:
使用json_encode和json_decode格式輸出要serialize和unserialize格式快得多。
JSON格式是可讀的。
JSON格式比serialize返回?cái)?shù)據(jù)結(jié)果小。
JSON格式是開(kāi)放的、可移植的。其他語(yǔ)言也可以使用它。
$a = array('a' = 'Apple' ,'b' = 'banana' , 'c' = 'Coconut');
//序列化數(shù)組$s = json_encode($a);echo $s;//輸出結(jié)果:{"a":"Apple","b":"banana","c":"Coconut"}
echo '
;
//反序列化$o = json_decode($s);
在上面的例子中,json_encode輸出長(zhǎng)度比上個(gè)例子中serialize輸出長(zhǎng)度顯然要短。[page]
3、什么是PHP序列化——var_export 和 eval
var_export 函數(shù)把變量作為一個(gè)字符串輸出;eval把字符串當(dāng)成PHP代碼來(lái)執(zhí)行,反序列化得到最初變量的內(nèi)容。
$a = array('a' = 'Apple' ,'b' = 'banana' , 'c' = 'Coconut');
//序列化數(shù)組$s = var_export($a , true);echo $s;//輸出結(jié)果: array ( 'a' = 'Apple', 'b' = 'banana', 'c' = 'Coconut', )
echo '
';
//反序列化eval('$my_var=' . $s . ';');
print_r($my_var);
4、什么是PHP序列化——wddx_serialize_value 和 wddx deserialize
wddx_serialize_value函數(shù)可以序列化數(shù)組變量,并以XML字符串形式輸出。
$a = array('a' = 'Apple' ,'b' = 'banana' , 'c' = 'Coconut');
//序列化數(shù)組$s = wddx_serialize_value($a);echo $s;
//輸出結(jié)果(查看輸出字符串的源碼): ApplebananaCoconut
echo '
';
//反序列化$o = wddx_deserialize($s);
print_r($o);//輸出結(jié)果:Array ( [a] = Apple [b] = banana 1 = Coconut )
可以看出,XML標(biāo)簽字符較多,導(dǎo)致這種格式的序列化還是占了很多空間。
結(jié)論
上述所有的函數(shù)在序列化數(shù)組變量時(shí)都能正常執(zhí)行,但運(yùn)用到對(duì)象就不同了。例如json_encode序列化對(duì)象就會(huì)失敗。反序列化對(duì)象時(shí),unserialize和eval將有不同的效果。
本篇《什么是PHP序列化?這個(gè)知識(shí)點(diǎn)才是你應(yīng)該了解到的用》到這里就已經(jīng)結(jié)束了,小編一直認(rèn)為,某一個(gè)編程軟件受歡迎是有一定原因的,首先吸引人的一定是其功能,環(huán)球網(wǎng)校的小編祝您PHP學(xué)習(xí)之路順利,如果你還想知道更多php知識(shí),也可以點(diǎn)擊本站的其他文章進(jìn)行學(xué)習(xí)。