導航:首頁 > 編程語言 > php序列化和反序列化

php序列化和反序列化

發布時間:2022-05-16 23:24:14

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

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

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

<?php
$stooges
=
array('Moe','Larry','Curly');
$new
=
serialize($stooges);
print_r($new);echo
"<br
/>";
print_r(unserialize($new));
?>
serialize() 把變數和它們的值編碼成文本形式
unserialize() 恢復原先變數

⑷ thinkphp 反序列化有什麼用

變數的輸出:

在模板中輸出一個變數有兩種形式:{$list.name} {$list[『name』]}

在模板中可以使用系統變數,以$Think.開頭

系統變數:(舉例選幾個)

獲得伺服器的IP地址:{$Think.server.SERVER_ADDR}

獲得外部訪問的IP地址:{$Think.server.REMOTE_ADDR}

獲得伺服器的名稱:{$Think.server.SERVER_NAME}

獲得ThinkPHP內部定義的變數:

獲得當前的時間:{$Think.now}

獲得當前工具的版本:{$Think.version}

模板的頁面:{$Think.template}

模板標簽起始符號:{$Think.LDELIM }

模板標簽結束符號:{$Think.RDELIM }

系統常量:(舉例選幾個)

獲得當前文件的url :{$Think.const.__SELF__}

獲得模板配置文件的配置項的值:

{$Think.config.db_name}

在ThinkPHP模板中,對變數使用函數調節:

從控制器分配了一個字元串,在模板中,如何截取這個字元串:{$str|substr=###,5,3} 如果當前參數為函數的第一個參數,可以不寫###

在模板中載入外部文件:

使用<include file=」」> file( )和display( )的用法一樣。

If標簽的使用:<if condition=」條件1」>value1<elseifcondition=」條件2」>value2<else/>value3</if> condition裡面寫成比較運算符 eq表示等於 neq表示不等於

修改模板引擎的界定符:

在配置文件中,通過TMPL_L_DELIM修改

『TMPL_L_DELIM』=>』<{』 //修改左定界符

『TMPL_R_DELIM』=>』<{』 //修改右定界符

修改模板引擎:

'TMPL_ENGINE_TYPE'=>'Smarty'

在分組中添加配置文件,在控制器中使用直接調用C函數。

ThinkPHP的緩存機制:

數據緩存:就是講資料庫中獲得的數據保存在一個介質上,需要時直接在這個介質上讀取。

我們需要通過ThinkPHP中的cache類來實現,通過這個類的方法獲得對象,在通過這個對象來實現不同介質的數據處理。

通過傳遞不同的參數獲得不通過的數據處理對象。

$cache=Cache::getInstance(『File』);

頁面緩存:

1. 開啟緩存

在配置文件中開啟緩存,開啟緩存有一定的規則(數組格式)。

『HTML_CACHE_ON』=> true,

『HTML_CACHE_RULES』=>array(

//需要緩存的動作名=>緩存的名稱,緩存的生存周期

『show』=>array(『{:mole}_{:action}』,1000),

)

{:mole}代表當前的控制器名

{:action}代表當前的動作名(例如:show)

{$_GET}<=>{$Think.get.id} 簡寫形式{$_get}

通過地址欄傳遞一個id參數,可以實現單頁面多緩存

(通常是前台有緩存,後台不緩存)

局部不緩存:

在TP框架中,局部不緩存可以通過js , ajax , jQuery實現局部不緩存

<scripttype="text/JavaScript">

var date=Date();

document.write(date);

</script>

工廠模式:通過傳遞不同參數獲得不同的對象

單例模式:這個類只獲得一個對象,再調用這個對象方法

緩存的增刪改查

增:$cache->set(『password』,』123』,30) 第三個參數是緩存的有效期

刪:rm( ) 改:set( ) 查:get( )

序列化( serialize( ) ):保存數據的時候,將數組或者對象序列化成字元串,但是這個字元串保存了數組或者對象之前的結構和內容,當我們需要獲得這個數據的時候,在將序列化的字元串反序列化成我們需要的數組或對象(unserialize( ))

例子:

public functionxv(){

//序列化與反序列化

$a=array('name'=>'xiaoming');

$x=serialize($a);

echo $x; //輸出結果為:a:1:{s:4:"name";s:8:"xiaoming";}

echo "<br/>";

$f=unserialize($x);

print_r($f);//輸出原來的數組格式

}

⑸ php序列化的為什麼__sleep睡眠後,為什麼反序列還是全部打出來了

序列化是將變數轉換為可保存或傳輸的字元串的過程;反序列化就是在適當的時候把這個字元串再轉化成原來的變數使用。這兩個過程結合起來,可以輕松地存儲和傳輸數據,使程序更具維護性。PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變數類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。在PHP中,序列化和反序列化很多地方都可以用到!~例如:資料庫連接,序列化數組等等。

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

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

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

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

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

⑺ php如何循環反序列化

1.構造HITCON類反序列化字元串,其中$method='login',$args數組』username』部分可用於構造SQL語句,進行SQL注入,'password』部分任意設置。

2.調用login()函數後,利用username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置username構造聯合查詢,使查詢結果為SoFun類反序列化字元串,設置file=『flag.php』,需繞過__wakeup()函數。

3.繞過oadData()函數對反序列化字元串的驗證。

4.SoFun類 __destruct()函數調用後,包含flag.php文件,獲取flag,需繞過__wakeup()函數

⑻ php數組序列化a:1:{i:0;s:1:"1"} 的詳細解釋

1、首先創建好一個數組然後序列化,array("table" => member, "field" => 1,"rule" => -0 ,"cycle" => 24 ,"max" => 1 )。

⑼ php資料庫數組反序列化取指定內容

$str='a:2:{i:0;b:0;s:8:"bankinfo";a:1:{i:1;a:2{s:6:"bankid";i:1;s:7:"cardnum";s:4:"adda";}}}';
$res=unserialize($str);
echo$res['bankinfo'][1]['cardnum'];

這個數組整個結構是

Array(
[0]=>false
[bankinfo]=>Array(
[1]=>Array(
[bankid]=>1
[cardnum]=>adda
)
)
)

⑽ 到底什麼是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序列化和反序列化相關的資料

熱點內容
連續加減乘除法的演算法 瀏覽:652
用mfc編程實現dda演算法 瀏覽:41
linux命令打開應用 瀏覽:146
改造後的程序員 瀏覽:270
數控編程變數 瀏覽:785
江門哪裡有plc編程系統 瀏覽:378
安卓手機如何下載外服b站 瀏覽:700
pythonetree庫 瀏覽:759
數據插值演算法 瀏覽:723
澳大利亞加密貨幣逃稅 瀏覽:482
pdf文檔如何壓縮 瀏覽:329
java單例模式線程安全 瀏覽:646
特種pdf 瀏覽:160
加油什麼app劃算 瀏覽:715
開服要什麼樣的伺服器 瀏覽:33
pdf文件太大怎麼壓縮 瀏覽:29
UK開票顯示文件夾不存在 瀏覽:668
無錫江蘇大容量伺服器公司雲主機 瀏覽:503
pdf朱紹侯 瀏覽:227
編程貓演算法求和 瀏覽:556