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. ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)2. XMLDOM對(duì)象方法:對(duì)象屬性3. 探究Android客戶端網(wǎng)絡(luò)預(yù)連接優(yōu)化機(jī)制4. Python基礎(chǔ)之Socket通信原理5. 淺談Python numpy創(chuàng)建空數(shù)組的問題6. ASP.NET Identity的基本用法7. 使用IDEA編寫jsp時(shí)EL表達(dá)式不起作用的問題及解決方法8. ASP.NET MVC擴(kuò)展帶驗(yàn)證的單選按鈕9. 淺析Python實(shí)現(xiàn)DFA算法10. 解決ajax的delete、put方法接收不到參數(shù)的問題方法
