導航:首頁 > 編程語言 > php中數組序列化

php中數組序列化

發布時間:2022-08-11 15:47:52

⑴ 到底什麼是php序列化

在PHP中,序列化用於存儲或傳遞 PHP 的值的過程中,同時不丟失其類型和結構。本文講述PHP序列化的四種方案,感興趣的可以了解一下


序列化是將變數轉換為可保存或傳輸的字元串的過程;反序列化就是在適當的時候把這個字元串再轉化成原來的變數使用。這兩個過程結合起來,可以輕松地存儲和傳輸數據,使程序更具維護性。


1、什麼是PHP序列化——serialize和unserialize函數


這兩個是序列化和反序列化PHP中數據的常用函數。


$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');


//序列化數組$s = serialize($a);echo $s;//輸出結果: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);


當數組值包含如雙引號、單引號或冒號等字元時,它們被反序列化後,可能會出現問題。為了克服這個問題,一個巧妙的技巧是使用base64_encode和base64_decode。


$obj = array();//序列化$s = base64_encode(serialize($obj)); //反序列化$original = unserialize(base64_decode($s));


但是base64編碼將增加字元串的長度。為了克服這個問題,可以和gzcompress一起使用。


//定義一個用來序列化對象的函數


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格式序列化和反序列化是一個不錯的選擇:


使用json_encode和json_decode格式輸出要serialize和unserialize格式快得多。


JSON格式是可讀的。


JSON格式比serialize返回數據結果小。


JSON格式是開放的、可移植的。其他語言也可以使用它。


$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');


//序列化數組$s = json_encode($a);echo $s;//輸出結果:{"a":"Apple","b":"banana","c":"Coconut"}


echo '


;


//反序列化$o = json_decode($s);


在上面的例子中,json_encode輸出長度比上個例子中serialize輸出長度顯然要短。[page]


3、什麼是PHP序列化——var_export 和 eval


var_export 函數把變數作為一個字元串輸出;eval把字元串當成PHP代碼來執行,反序列化得到最初變數的內容。


$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');


//序列化數組$s = var_export($a , true);echo $s;//輸出結果: 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函數可以序列化數組變數,並以XML字元串形式輸出。


$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');


//序列化數組$s = wddx_serialize_value($a);echo $s;


//輸出結果(查看輸出字元串的源碼): ApplebananaCoconut


echo '


';


//反序列化$o = wddx_deserialize($s);


print_r($o);//輸出結果:Array ( [a] => Apple [b] => banana 1 => Coconut )


可以看出,XML標簽字元較多,導致這種格式的序列化還是佔了很多空間。


結論


上述所有的函數在序列化數組變數時都能正常執行,但運用到對象就不同了。例如json_encode序列化對象就會失敗。反序列化對象時,unserialize和eval將有不同的效果。


本篇《什麼是PHP序列化?這個知識點才是你應該了解到的用》到這里就已經結束了,小編一直認為,某一個編程軟體受歡迎是有一定原因的,首先吸引人的一定是其功能,環球網校的小編祝您PHP學習之路順利,如果你還想知道更多php知識,也可以點擊本站的其他文章進行學習。

⑵ php的序列化和反序列化有什麼好處

序列化是將變數轉換為可保存或傳輸的字元串的過程;反序列化就是在適當的時候把這個字元串再轉化成原來的變數使用。這兩個過程結合起來,可以輕松地存儲和傳輸數據,使程序更具維護性。

PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變數類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。

在PHP中,序列化和反序列化很多地方都可以用到!~

例如:資料庫連接,序列化數組等等。

⑶ php的序列化和反序列化有什麼好處

序列化是將變數轉換為可保存或傳輸的字元串的過程;反序列化就是在適當的時候把這個字元串再轉化成原來的變數使用。這兩個過程結合起來,可以輕松地存儲和傳輸數據,使程序更具維護性。

PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變數類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。

在PHP中,序列化和反序列化很多地方都可以用到!~

例如:資料庫連接,序列化數組等等。

⑷ PHP中序列化有什麼用處

你想如果想把一個數組或者是對象存儲到文件或資料庫中,怎麼辦。不能像字元串那樣的存儲吧。所以在存儲數組或對象之前先serialize,在取回內容時再unserialize...
一句話:serialize的作用是 產生一個可存儲的值的表示.unserialize的作用是 對單一的已序列化的變數進行操作,將其轉換回 PHP 的值。
更多問題可以去php中文網問答社區提問http://www.php.cn/wenda.html,大神在線幫你解決,希望對你有幫助

⑸ 序列化的PHP

注: 在 php 3 中,在序列化和解序列化的過程中對象會失去類的關聯。結果的變數是對象類型,但是沒有類和方法,因此就沒什麼用了(就好像一個用滑稽的語法定義的數組一樣)。
serialize() 返回一個字元串,包含著可以儲存於 php 的任何值的位元組流表示。unserialize() 可以用此字元串來重建原始的變數值。用序列化來保存對象可以保存對象中的所有變數。對象中的函數不會被保存,只有類的名稱。
要能夠 unserialize() 一個對象,需要定義該對象的類。也就是,如果序列化了 page1.php 中類 A 的對象 $a,將得到一個指向類 A 的字元串並包含有所有 $a 中變數的值。如果要在 page2.php 中將其解序列化,重建類 A 的對象 $a,則 page2.php 中必須要出現類 A 的定義。例如可以這樣實現,將類 A 的定義放在一個包含文件中,並在 page1.php 和 page2.php 都包含此文件。
<?php// classa.inc: class A { var $one = 1; function show_one() { echo $this->one; } }// page1.php: include(classa.inc); $a = new A; $s = serialize($a); // 將 $s 存放在某處使 page2.php 能夠找到 $fp = fopen(store, w); fwrite($fp, $s); fclose($fp);// page2.php: // 為了正常解序列化需要這一行 include(classa.inc); $s = implode(, @file(store)); $a = unserialize($s); // 現在可以用 $a 對象的 show_one() 函數了 $a->show_one();?>
如果在用會話並使用了 session_register() 來注冊對象,這些對象會在每個 php 頁面結束時被自動序列化,並在接下來的每個頁面中自動解序列化。基本上是說這些對象一旦成為會話的一部分,就能在任何頁面中出現。
強烈建議在所有的頁面中都包括這些注冊的對象的類的定義,即使並不是在所有的頁面中都用到了這些類。如果沒有這樣做,一個對象被解序列化了但卻沒有其類的定義,它將失去與之關聯的類並成為 stdClass 的一個對象而完全沒有任何可用的函數,這樣就很沒有用處。
因此如果在以上的例子中 $a 通過運行 session_register(a) 成為了會話的一部分,應該在所有的頁面中包含 classa.inc 文件,而不只是 page1.php 和 page2.php。

⑹ PHP中序列化有什麼用處

序列化可以將PHP中 對象、類、數組、變數、匿名函數等,轉化為字元串,這樣用戶就方便儲存和傳輸,對伺服器或web中減輕一定的壓力。

⑺ php語言中,序列化到底在那裡使用它的優勢是什麼劣勢是什麼

序列化某項的時候,會很省事,比如:form的提交,某個數據集中,因為序列化後就不必再在意裡面的字元,是不是會注入等等。好處還是很多的。

至少劣勢嘛,序列化後的字元數量要比序列化前的多,如果想放入cookie的時候需要注意長度,某些字元還需要轉義,放入到庫中的時候,因為長度不確定,必須得用text的欄位。

總的得講,因功能而宜,有的時候,序列化是很有用的,會幫你省好多的事情

⑻ php 數組序列化

mixed unserialize ( string str [, string callback] )

unserialize() 對單一的已序列化的變數進行操作,將其轉換回 PHP 的值。返回的是轉換之後的值,可為 integer、float、string、array 或 object。如果傳遞的字元串不可解序列化,則返回 FALSE。

unserialize_callback_func 指令: 如果在解序列化的時候需要實例化一個未定義類,則可以設置回調函數以供調用(以免得到的是不完整的 object 「__PHP_Incomplete_Class」)。可通過 php.ini、ini_set() 或 .htaccess 定義『unserialize_callback_func』。每次實例化一個未定義類時它都會被調用。若要禁止這個特性,只需置空此設定。還需要注意的是 unserialize_callback_func 指令是從 PHP 4.2.0 開始提供使用的。

若被解序列化的變數是一個對象,在成功地重新構造對象之後,PHP 會自動地試圖去調用 __wakeup() 成員函數(如果存在的話)。 例子 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'); // 設置您的回調函數

function mycallback($classname) {
// 只需包含含有類定義的文件
// $classname 指出需要的是哪一個類
}
?>

<?php
// 這里,我們使用 unserialize() 裝載來自資料庫的 $session_data 數組中的會話數據。
// 此例是描述 serialize() 的那個例子的補充。

$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)) {
// 如果執行出錯或返回錯誤,則初始化為空數組
$session_data = array();
} else {
// 現在我們需要的是 $tmp[0] 中已序列化的數據。
$session_data = unserialize ($tmp[0]);
if (!is_array ($session_data)) {
// 出錯,初始化為空數組
$session_data = array();
}
}
?>

⑼ php 什麼是序列化

string serialize ( mixed value )

serialize() 返回字元串,此字元串包含了表示 value 的位元組流,可以存儲於任何地方。

這有利於存儲或傳遞 PHP 的值,同時不丟失其類型和結構。

想要將已序列化的字元串變回 PHP 的值,可使用 unserialize()。serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數組。你正 serialize() 的數組/對象中的引用也將被存儲。

當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數 __sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 __wakeup() 成員函數。

注: 在 PHP 3 中,對象屬性將被序列化,但是方法則會丟失。PHP 4 打破了此限制,可以同時存儲屬性和方法。請參見類與對象中的序列化對象部分獲取更多信息。

例子 1. serialize() 示例

<?php
// $session_data 是包含了當前用戶 session 信息的多維數組。
// 我們使用 serialize() 在請求結束之前將其存儲到資料庫中。

$conn = odbc_connect ("webdb", "php", "chicken");
$stmt = odbc_prepare ($conn,
"UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $PHP_AUTH_USER);
if (!odbc_execute ($stmt, &$sqldata)) {
$stmt = odbc_prepare($conn,
"INSERT INTO sessions (id, data) VALUES(?, ?)");
if (!odbc_execute($stmt, &$sqldata)) {
/* 出錯 */
}
}
?>

⑽ php序列化問題

你這樣不叫序列化呀。我告訴你如何傳陣列的一種方法,也不是用序列化方法,但是在傳短小的陣列的時候是可以用的。
<input type="hidden" name="post_data[0][a]" value="<?php echo $arr[0][a]?>" />
<input type="hidden" name="post_data[0][b]" value="<?php echo $arr[0][b]?>" />
<input type="hidden" name="post_data[1][x]" value="<?php echo $arr[1][x]?>" />
<input type="hidden" name="post_data[1][y]" value="<?php echo $arr[1][y]?>" />

閱讀全文

與php中數組序列化相關的資料

熱點內容
台灣四級論理電影 瀏覽:578
以肉為主yy小說txt下載 瀏覽:727
俄羅斯穿越電影 瀏覽:485
韓國《奇怪的美發沙龍》中文 瀏覽:137
建行app怎麼調成日間模式 瀏覽:666
穿越皇帝當種馬 瀏覽:48
程序員和對象關系不清楚 瀏覽:133
能編輯文件夾的程序 瀏覽:981
國產劇情中國大胸女孩 瀏覽:761
滅門慘案哪三部 瀏覽:1002
蝴蝶gl電影 瀏覽:848
主角叫陸離的小說 瀏覽:99
大寸度電影全裸帶毛 瀏覽:292
韓國一個女的彈鋼琴什麼電影 瀏覽:828
實現伺服器上文件如何下載到本地 瀏覽:268
日本大電影什麼意思 瀏覽:859
紅城堡有電影版嗎 瀏覽:710
阿文是哪部電影的人物 瀏覽:662
閔度允演坐輪椅的電影 瀏覽:913