PHP基礎(chǔ)之類和對(duì)象22——對(duì)象序列化
所謂的序列化對(duì)象就是在會(huì)話中存放對(duì)象
所有php里面的值都可以使用函數(shù)?serialize()來返回一個(gè)包含字節(jié)流的字符串來表示。?unserialize()函數(shù)能夠重新把字符串變回php原來的值。 序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類的名字。
為了能夠?unserialize()一個(gè)對(duì)象,這個(gè)對(duì)象的類必須已經(jīng)定義過。如果序列化類A的一個(gè)對(duì)象,將會(huì)返回一個(gè)跟類A相關(guān),而且包含了對(duì)象所有變量值的字符串。 如果要想在另外一個(gè)文件中解序列化一個(gè)對(duì)象,這個(gè)對(duì)象的類必須在解序列化之前定義,可以通過包含一個(gè)定義該類的文件或使用函數(shù)?spl_autoload_register()來實(shí)現(xiàn)。
<?php // classa.inc: class A {public $one = 1;public function show_one() { echo $this->one;} } // page1.php: include('classa.inc'); $a = new A; $s = serialize($a); // 把變量$s保存起來以便文件page2.php能夠讀到 file_put_contents(’store’, $s); // page2.php: // 要正確了解序列化,必須包含下面一個(gè)文件 include('classa.inc'); $s = file_get_contents(’store’); $a = unserialize($s); // 現(xiàn)在可以使用對(duì)象$a里面的函數(shù) show_one() $a->show_one();?>
當(dāng)一個(gè)應(yīng)用程序使用函數(shù)?session_register()來保存對(duì)象到會(huì)話中時(shí),在每個(gè)頁面結(jié)束的時(shí)候這些對(duì)象都會(huì)自動(dòng)序列化,而在每個(gè)頁面開始的時(shí)候又自動(dòng)解序列化。 所以一旦對(duì)象被保存在會(huì)話中,整個(gè)應(yīng)用程序的頁面都能使用這些對(duì)象。但是,?session_register()這個(gè)函數(shù)在php5.3.0已經(jīng)廢棄,而且在php6.0.0就不再支持,所以不要依賴這個(gè)函數(shù)。
在應(yīng)用程序中序列化對(duì)象以便在之后使用,強(qiáng)烈推薦在整個(gè)應(yīng)用程序都包含對(duì)象的類的定義。 不然有可能出現(xiàn)在解序列化對(duì)象的時(shí)候,沒有找到該對(duì)象的類的定義,從而把沒有方法的類__PHP_Incomplete_Class_Name作為該對(duì)象的類,導(dǎo)致返回一個(gè)沒有用的對(duì)象。
所以在上面的例子中,當(dāng)運(yùn)行session_register('a'),把變量$a放在會(huì)話里之后,需要在每個(gè)頁面都包含文件classa.inc,而不是只有文件page1.php和page2.php。
相關(guān)文章:
1. Java如何基于反射機(jī)制獲取不同的類2. php模擬實(shí)現(xiàn)斗地主發(fā)牌3. asp判斷某個(gè)文件是否存在的函數(shù)4. IntelliJ IDEA安裝插件的方法步驟5. Android table布局開發(fā)實(shí)現(xiàn)簡(jiǎn)單計(jì)算器6. 理解PHP5中static和const關(guān)鍵字7. ASP.NET泛型三之使用協(xié)變和逆變實(shí)現(xiàn)類型轉(zhuǎn)換8. .Net Core使用Coravel實(shí)現(xiàn)任務(wù)調(diào)度的完整步驟9. .NET Core Web APi類庫內(nèi)嵌運(yùn)行的方法10. Vuex localStorage的具體使用

網(wǎng)公網(wǎng)安備