PHP基礎(chǔ)之類和對(duì)象22——對(duì)象序列化
所謂的序列化對(duì)象就是在會(huì)話中存放對(duì)象
所有php里面的值都可以使用函數(shù)?serialize()來(lái)返回一個(gè)包含字節(jié)流的字符串來(lái)表示。?unserialize()函數(shù)能夠重新把字符串變回php原來(lái)的值。 序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類的名字。
為了能夠?unserialize()一個(gè)對(duì)象,這個(gè)對(duì)象的類必須已經(jīng)定義過(guò)。如果序列化類A的一個(gè)對(duì)象,將會(huì)返回一個(gè)跟類A相關(guān),而且包含了對(duì)象所有變量值的字符串。 如果要想在另外一個(gè)文件中解序列化一個(gè)對(duì)象,這個(gè)對(duì)象的類必須在解序列化之前定義,可以通過(guò)包含一個(gè)定義該類的文件或使用函數(shù)?spl_autoload_register()來(lái)實(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保存起來(lái)以便文件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()來(lái)保存對(duì)象到會(huì)話中時(shí),在每個(gè)頁(yè)面結(jié)束的時(shí)候這些對(duì)象都會(huì)自動(dòng)序列化,而在每個(gè)頁(yè)面開始的時(shí)候又自動(dòng)解序列化。 所以一旦對(duì)象被保存在會(huì)話中,整個(gè)應(yīng)用程序的頁(yè)面都能使用這些對(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è)頁(yè)面都包含文件classa.inc,而不是只有文件page1.php和page2.php。
相關(guān)文章:
1. ASP.NET MVC獲取多級(jí)類別組合下的產(chǎn)品2. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車3. ThinkPHP5 通過(guò)ajax插入圖片并實(shí)時(shí)顯示(完整代碼)4. Docker 容器健康檢查機(jī)制5. CSS3實(shí)現(xiàn)動(dòng)態(tài)翻牌效果 仿百度貼吧3D翻牌一次動(dòng)畫特效6. python使用openpyxl庫(kù)讀寫Excel表格的方法(增刪改查操作)7. python os.listdir()亂碼解決方案8. ASP實(shí)現(xiàn)文件上傳的方法9. Python使用socket_TCP實(shí)現(xiàn)小文件下載功能10. python中asyncio異步編程學(xué)習(xí)
