導航:首頁 > 編程語言 > php對象序列化

php對象序列化

發布時間:2022-08-12 03:11:54

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中說的序列化對象是什麼意思

簡單的說,就是把一個包含很多內容的對象變成字元串.用於傳輸或存儲.
不太恰當的比喻,好比在<<駭客帝國>>中人從電話線中送到目的端(序列化後傳輸),再還原成人.(unserialize).
==============
serialize() 返回字元串,此字元串包含了表示 value 的位元組流,可以存儲於任何地方。

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

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

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

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

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

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

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

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

Ⅳ PHP中序列化有什麼用處

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

Ⅳ 請寫出php變數序列化和反序列化的函數,並舉出1個應用例子

PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變數類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。$str = serialize ($obj);...$obj222 = unserialize($str);現在可以用$object222對象來執行該對象可以執行的各種操作。在用serialize序列化對象時,會自動調用__sleep方法,__sleep方法必須返回一個數組,包含需要串列化的屬性。 PHP會拋棄其它屬性的值, 如果沒有__sleep方法,PHP將保存所有屬性,包括private屬性。用unserialize反序列化對象時,PHP 會調用__wakeup方法。__sleep和__wakeup方法可以根據實際需要,都添加上,也可以只要其中的一個,當然也可以都不要。下面給出一個序列化的代碼:共serialize.php和unserialize.php兩個文件。// serialize.php<?php
class User
{
private $name;
private $id;
public $sex="F";

function __construct()
{
//give user a unique ID 賦予一個不同的ID
$this->id = uniqid();
}

function __sleep()
{
//do not serialize this->id 不串列化id
return(array("name","sex"));
}

function __wakeup()
{
//give user a unique ID
$this->id = uniqid();
}

function p(){
echo "in function p() \t";
return $this->name;
}
function setname($name){
$this->name = $name;
}
} //create object 建立一個對象
$u = new User;
$u->setname("pphu");
//serialize it 串列化
$s = serialize($u);
echo "in serialize.php <br/>";
print_r($s);
echo "<br/>";
print_r($u);
echo "<br/><br/>";
?> //// unserialize.php<?php
include('serialize.php');
//global $s;
$u2 = unserialize($s);
echo "in unserialize.php<br/>";
echo $u2->p()."<br/>";
echo $u2->sex."<br/>";
print_r($u2);
?>

Ⅵ PHP中序列化有什麼用處

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

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

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

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

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

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

Ⅷ 到底什麼是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的SESSION直接保存對象序列化,但反序列化時出錯

在output.php中$person沒有實例化成Person對象,所以無法調用Person對象的outPut()方法。

Ⅹ PHP序列化數據存儲在資料庫中使用json還是serialize好

1) 空間的比較
serialize在編碼後大概是json的1.5倍。
原因:
serialize後字元串包含了子串的長度,這可能是速度方面的優化,但是測試結果不盡人意。
serialize有更加詳細的類型區分,而json只有四種類型,並且是以簡單的符號表示。

2)速度的比較
在較小數據的情況下, serialize比json快數量級。
在大數據量的情況下,json比serialize稍微差一點

3)處理對象
json無法處理對象方法等數據。

4)使用范圍
在前後端交互一般都使用JSON,另外,目前JSON只支持UTF-8編碼的數據。
序列化使用serialize,特別是對象的存儲。這是其存在的意義。
與對象無關的數據存儲可以使用json,如包含大量數字的數組等。

這篇博客概括滿全面:http://blog.csdn.net/hguisu/article/details/7651730

閱讀全文

與php對象序列化相關的資料

熱點內容
idpdf空白 瀏覽:475
如何才算一個真正的程序員 瀏覽:205
單片機控制系統介紹 瀏覽:123
steam上哪個文件夾可以看dlc 瀏覽:325
我的世界伺服器領地如何擴建 瀏覽:127
matlabmex未找到編譯器 瀏覽:431
什麼是銀鎖加密 瀏覽:217
安卓手機怎麼設置窗口小 瀏覽:992
鋼鐵俠加密優盤 瀏覽:219
linux用戶不能登錄 瀏覽:79
元龍雲伺服器 瀏覽:734
安全中心打開應用加密怎樣關閉 瀏覽:634
pdf怎麼轉換成cad格式 瀏覽:884
如何加密rgss3a 瀏覽:33
android控制項寬高比 瀏覽:728
vivo打開文件夾特效能改嗎 瀏覽:647
吃雞剪輯用什麼app 瀏覽:528
騰達app閃退是什麼問題 瀏覽:983
模擬器如何調安卓版本 瀏覽:65
單片機句子 瀏覽:228