本篇內(nèi)容主要講解“如何將串行化的變量轉(zhuǎn)化成PHP原始的變量值”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何將串行化的變量轉(zhuǎn)化成PHP原始的變量值”吧!
站在用戶的角度思考問題,與客戶深入溝通,找到荊州網(wǎng)站設(shè)計(jì)與荊州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋荊州地區(qū)。
在PHP中有多串行化處理的函數(shù):serialize(),該函數(shù)把任何變量值(除了資源變量)轉(zhuǎn)化為字符串的形式,可以把字符串保存到文件里,或者注冊為Session,乃至于使用curl來模擬GET/POST來傳輸變量,達(dá)到RPC的效果。
如果要將串行化的變量轉(zhuǎn)化成PHP原始的變量值,那么可以使用unserialize()函數(shù)。
一、變量串行化
我們舉簡單的例子來說明串行化,以及它的存儲格式。
整型:
$var=23;
echoserialize($var);
輸出:
i:23;
浮點(diǎn)型:
$var=1.23;
echoserialize($var);
輸出:
d:1.229999999999999982236431605997495353221893310546875;
字符串:
$var="Thisisastring";
echoserialize($var);
$var="我是變量";
echoserialize($var);
輸出:
s:16:"Thisisastring";
s:8:"我是變量";
布爾型:
$var=true;
echoserialize($var);
$var=false;
echoserialize($var);
輸出:
b:1;
b:0;
上面這些基本類型串行化之后的情況很清楚,串行化之后的存儲格式是:
變量類型:[變量長度:]變量值;
就是第一位字符代表變量類型,第二個:代表分割,變量長度是可選的,就是在字符串類型里有,其他類型沒有,最后一個就是變量值,每個串行化的值以";"作為結(jié)束。
比如我們整型數(shù)字23串行化之后就是:i:23,那么它沒有長度,只有類型和變量值,i代表integer,通過冒號分割,后面保存的是整型值23,包括浮點(diǎn)型(雙字節(jié)型)也是一樣。布爾型的話,類型是b(boolean),如果是true的話,那么串行化的值是1,如果是false那么值就是0。字
符串值話中間會多一個保存的值得,保存字符串的長度值,比如字符串"Thisisastring",那么生成的串行化的值是s:16:"Thisisastring";s是string,代表類型,中間的16就是該字符串的長度,如果是中文的話,那么每個中文是兩個字符來保存的,比如字符串"我是變量",生成的串行化值是:s:8:"我是變量";就是8個字符的長度。
下面我們重點(diǎn)來講一下數(shù)組變量串行化。
數(shù)組變量:
$var=array("abc","def","xyz","123");
echoserialize($var);
輸出:
a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz";i:3;s:3:"123";}
就是把我的數(shù)組$var串行化得到的字符串值,我們的$var數(shù)組包括4個字符串元素,分別是"abc","def","xyz","123",我們來分析一下串行化后的數(shù)據(jù),為了簡便起見,我們把串行化的數(shù)據(jù)列成數(shù)組的樣式:
a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}
這樣排列就比較清晰了,看開始的字符串:a:4:{...}首先第一個字符a保存的是變量類型是array(數(shù)組)類型,第二個4保存的是數(shù)組元素的個數(shù),一共有4個,然后在{}之間數(shù)組元素的內(nèi)容。比如第一個數(shù)組元素:i:0;s:3:"abc";i代表是當(dāng)前數(shù)組元素的索引值類型是整型,并且值是0,元素值的類型是s(字符串的),個數(shù)是3個,具體值是"abc",分號結(jié)束,下面的數(shù)組元素依次類推。
我們再看看使用字符串做為元素索引會如何:
$var=array("index1"=>"abc","index2"=>"def","index3"=>"xyz","index4"=>"123");
echoserialize($var);
輸出:
a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6:"index3";s:3:"xyz";s:6:"index4";s:3:"123";}
變成數(shù)組樣式后:
a:4:
{
s:6:"index1";s:3:"abc";
s:6:"index2";s:3:"def";
s:6:"index3";s:3:"xyz";
s:6:"index4";s:3:"123";
}
其實(shí)跟上面沒有太大區(qū)別,不過是開始的索引變成了保存字符串的形式,比如第一個元素:s:6:"index1";s:3:"abc";第一項(xiàng)就是索引值:s:6:"index1";s是類型,6是索引字符串的長度,"index1"就是索引的值。后面的s:3:"abc";就是元素值,這個好理解,就不講了。
從上面來看,我們大致了解了基本數(shù)據(jù)類型的串行化,其實(shí)我們完全可以構(gòu)造自己的串行化功能,或者從這個角度去擴(kuò)展,開發(fā)自己的串行化程序,便于我們的變量交換。
當(dāng)然,其實(shí)我們也可以利用這個功能,把數(shù)組或者任意其他變量串行化成字符串,然后通過curl功能來模擬GET/POST功能,達(dá)到能夠無用用戶執(zhí)行動作就從遠(yuǎn)程服務(wù)器獲取數(shù)據(jù)的功能。
怎樣將串行化的變量轉(zhuǎn)化成PHP原始的變量值
二、對象序列化
對象的序列化也是一個比較普遍的功能,能夠把一個對象進(jìn)行串行化以后變成一個字符串,能夠保存或者傳輸。
我們先看一個例子:
classTestClass
{
var$a;
var$b;
functionTestClass()
{
$this->a="Thisisa";
$this->b="Thisisb";
}
functiongetA()
{
return$this->a;
}
functiongetB()
{
return$this->b;
}
}
$obj=newTestClass;
$str=serialize($obj);
echo$str;
輸出結(jié)果:
O:9:"TestClass":2:{s:1:"a";s:9:"Thisisa";s:1:"b";s:9:"Thisisb";}
我們來分析一個對象串行化之后的字符串。
O:9:"TestClass":2:
{
s:1:"a";s:9:"Thisisa";
s:1:"b";s:9:"Thisisb";
}
首先看對于對象本身的內(nèi)容:O:9:"TestClass":2:O是說明這是一個對象類型(object),然后9是代表對象的名字查過濃度,2是代表該對象有幾個屬性。在看兩個屬性的內(nèi)容:
s:1:"a";s:9:"Thisisa";其實(shí)跟數(shù)組的內(nèi)容比較類似,第一項(xiàng):s:1:"a";是描述屬性名稱的,第二項(xiàng)s:9:"Thisisa";是描述屬性值的。后面的屬性類似。
先說一種對象序列化的應(yīng)用,下面的內(nèi)容是PHP手冊上,沒有更改原文。
serialize()返回一個字符串,包含著可以儲存于PHP的任何值的字節(jié)流表示。unserialize()可以用此字符串來重建原始的變量值。用序列化來保存對象可以保存對象中的所有變量。對象中的函數(shù)不會被保存,只有類的名稱。
要能夠unserialize()一個對象,需要定義該對象的類。也就是,如果序列化了page1.php中類A的對象$a,將得到一個指向類A的字符串并包含有所有$a中變量的值。如果要在page2.php中將其解序列化,重建類A的對象$a,則page2.php中必須要出現(xiàn)類A的定義。這可以例如這樣實(shí)現(xiàn),將類A的定義放在一個包含文件中,并在page1.php和page2.php都包含此文件。
//classa.inc:
classA
{
var$one=1;
functionshow_one()
{
echo$this->one;
}
}
//page1.php:
include("classa.inc");
$a=newA;
$s=serialize($a);
//將$s存放在某處使page2.php能夠找到
$fp=fopen("store","w");
fputs($fp,$s);
fclose($fp);
//page2.php:
//為了正常解序列化需要這一行
include("classa.inc");
$s=implode("",@file("store"));
$a=unserialize($s);
//現(xiàn)在可以用$a對象的show_one()函數(shù)了
$a->show_one();
?>
如果在用會話并使用了session_register()來注冊對象,這些對象會在每個PHP頁面結(jié)束時被自動序列化,并在接下來的每個頁面中自動解序列化。基本上是說這些對象一旦成為會話的一部分,就能在任何頁面中出現(xiàn)。
強(qiáng)烈建議在所有的頁面中都包括這些注冊的對象的類的定義,即使并不是在所有的頁面中都用到了這些類。如果沒有這樣做,一個對象被解序列化了但卻沒有其類的定義,它將失去與之關(guān)聯(lián)的類并成為stdClass的一個對象而完全沒有任何可用的函數(shù),這樣就很沒有用處。
因此如果在以上的例子中$a通過運(yùn)行session_register("a")成為了會話的一部分,應(yīng)該在所有的頁面中包含classa.inc文件,而不只是page1.php和page2.php。
當(dāng)然,其實(shí)序列化對象其實(shí)完全可以應(yīng)用在很多地方。當(dāng)然,在PHP5中對序列化的處理不一樣了,我們看一下手冊中的說法:
serialize()檢查類中是否有魔術(shù)名稱__sleep的函數(shù)。如果這樣,該函數(shù)將在任何序列化之前運(yùn)行。它可以清除對象并應(yīng)該返回一個包含有該對象中應(yīng)被序列化的所有變量名的數(shù)組。
使用__sleep的目的是關(guān)閉對象可能具有的任何數(shù)據(jù)庫連接,提交等待中的數(shù)據(jù)或進(jìn)行類似的清除任務(wù)。此外,如果有非常大的對象而并不需要完全儲存下來時此函數(shù)也很有用。
相反地,unserialize()檢查具有魔術(shù)名稱__wakeup的函數(shù)的存在。如果存在,此函數(shù)可以重建對象可能具有的任何資源。
使用__wakeup的目的是重建在序列化中可能丟失的任何數(shù)據(jù)庫連接以及處理其它重新初始化的任務(wù)。
到此,相信大家對“如何將串行化的變量轉(zhuǎn)化成PHP原始的變量值”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章標(biāo)題:如何將串行化的變量轉(zhuǎn)化成PHP原始的變量值
網(wǎng)站網(wǎng)址:http://vcdvsql.cn/article4/gjeioe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、ChatGPT、營銷型網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)