日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何使用Serializable接口來自定義PHP中類的序列化

瀏覽:44日期:2022-09-07 15:59:21

關于PHP中的對象序列化這件事兒,之前我們在很早前的文章中已經提到過 __sleep() 和 __weakup() 這兩個魔術方法。今天我們介紹的則是另外一個可以控制序列化內容的方式,那就是使用 Serializable 接口。它的使用和上述兩個魔術方法很類似,但又稍有不同。

Serializable接口

class A implements Serializable { private $data; public function __construct(){echo ’__construct’, PHP_EOL;$this->data = 'This is Class A'; } public function serialize(){echo ’serialize’, PHP_EOL;return serialize($this->data); } public function unserialize($data){echo ’unserialize’, PHP_EOL;$this->data = unserialize($data); } public function __destruct(){echo ’__destruct’, PHP_EOL; } public function __weakup(){echo ’__weakup’, PHP_EOL; } public function __sleep(){echo ’__destruct’, PHP_EOL; } }$a = new A();$aSerialize = serialize($a);var_dump($aSerialize);// 'C:1:'A':23:{s:15:'This is Class A';}'$a1 = unserialize($aSerialize);var_dump($a1);

這段代碼就是使用 Serializable 接口來進行序列化處理的,注意一點哦,實現了 Serializable 接口的類中的 __sleep() 和 __weakup() 魔術方法就無效了哦,序列化的時候不會進入它們。

Serializable 這個接口需要實現的是兩個方法,serialize() 方法和 unserialize() 方法,是不是和那兩個魔術方法完全一樣。當然,使用的方式也是一樣的。

在這里,我們多普及一點序列化的知識。對象序列化只能序列化它們的屬性,不能序列化他們方法。如果當前能夠找到對應的類模板,那么可以還原出這個類的方法來,如果沒有定義過這個類的模板,那么還原出來的類是沒有方法只有屬性的。我們通過這段代碼中的序列化字符串來分析:

'C:',指的是當前數據的類型,這個我面后面還會講,實現 Serializable 接口的對象序列化的結果是 C: ,而沒有實現這個接口的對象序列化的結果是 O: 'A:',很明顯對應的是類名,也就是類的::class '{xxx}',對象結構和JSON一樣,也是用的花括號 各種類型的數據進行序列化的結果

下面我們再來看下不同類型序列化的結果。要知道,在PHP中,我們除了句柄類型的數據外,其他標量類型或者是數組、對象都是可以序列化的,它們在序列化字符串中是如何表示的呢?

$int = 110;$string = ’110’;$bool = FALSE;$null = NULL;$array = [1,2,3];var_dump(serialize($int)); // 'i:110;'var_dump(serialize($string)); // 's:3:'110';'var_dump(serialize($bool)); // 'b:0;'var_dump(serialize($null)); // 'N;'var_dump(serialize($array)); // 'a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}'

上面的內容還是比較好理解的吧。不過我們還是一一說明一下:

數字類型:i:<值> 字符串類型:s:<長度>:<值> 布爾類型:b:<值:0或1> NULL類型:N; 數組:a:<長度>:<內容> 對象在使用Serializable接口序列化時要注意的地方

接下來,我們重點講講對象類型,上面已經提到過,實現 Serializable 接口的對象序列化后的標識是有特殊情況的。上方序列化后的字符串開頭類型標識為 'C:',那么我們看看不實現 Serializable 接口的對象序列化后是什么情況。

// 正常對象類型序列化的結果class B { private $data = 'This is Class B';}$b = new B();$bSerialize = serialize($b);var_dump ($bSerialize); // 'O:1:'B':1:{s:7:'Bdata';s:15:'This is Class B';}'var_dump($bSerialize);var_dump(unserialize('O:1:'B':1:{s:7:'0B0data';s:15:'This is Class B';}'));// object(B)#4 (1) {// ['data':'B':private]=>string(15) 'This is Class B'// }

果然,它開頭的類型標識是 'O:'。那么我們可以看出,'C:' 很大的概率指的是當前序列化的內容是一個類類型,不是一個對象類型。它們之間其實并沒有顯著的差異,包括官方文檔上也沒有找到特別具體的說明。如果有過這方面的研究或者有相關資料的同學可以評論留言一起討論哈。

此外,如果我們手動將一個對象的 'O:' 轉成 'C:' 會怎么樣呢?

// 把O:替換成C:var_dump(unserialize(str_replace(’O:’, ’C:’, $bSerialize))); // false

抱歉,無法還原了。那么我們反過來,將上面 A 類也就是實現了 Serializable 接口的序列化字符串中的 'C:' 轉成 'O:' 呢?

// Warning: Erroneous data format for unserializing ’A’var_dump(unserialize(str_replace(’C:’, ’O:’, $aSerialize))); // false

嗯,會提示一個警告,然后同樣也無法還原了。這樣看來,我們的反序列化還是非常智能的,有一點點的不同都無法進行還原操作。

未定義類的反序列化操作

最后,我們來看看未定義類的情況下,直接反序列化一個對象。

// 模擬一個未定義的D類var_dump(unserialize('O:1:'D':2:{s:7:'0D0data';s:15:'This is Class D';s:3:'int';i:220;}'));// object(__PHP_Incomplete_Class)#4 (3) {// ['__PHP_Incomplete_Class_Name']=>string(1) 'D'// ['data':'D':private]=>string(15) 'This is Class D'// ['int']=>int(220)// }// 把未定義類的O:替換成C:var_dump(unserialize(str_replace(’O:’, ’C:’, 'O:1:'D':2:{s:7:'0D0data';s:15:'This is Class D';s:3:'int';i:220;}'))); // false

從代碼中,我們可以看出,'C:' 類型的字符串依然無法反序列化成功。劃重點哦,如果是C:開頭的序列化字符串,一定需要是定義過的且實現了 Serializable 接口的類 才能反序列化成功。

另外,我們可以發(fā)現,當序列化字符串中的模板不存在時,反序列化出來的類的類名是 __PHP_Incomplete_Class_Name 類,不像有類模板的反序列化成功直接就是正常的類名。

總結

其實從以上各種來看,個人感覺如果要保存數據或者傳遞數據的話,序列化并不是最好的選擇。畢竟包含了類型以及長度后將使得格式更為嚴格,而且反序列化回來的內容如果沒有對應的類模板定義也并不是特別好用的,還不如直接使用 JSON 來得方便易讀。當然,具體情況具體分析,我們還是要結合場景來選擇合適的使用方式。

測試代碼:

github.com/zhangyue050…

以上就是如何使用Serializable接口來自定義PHP中類的序列化的詳細內容,更多關于自定義PHP中類的序列化的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品看片| 欧美激情综合| 日韩在线短视频| 综合日韩av| 日本а中文在线天堂| 国产中文在线播放| 日韩精品一区二区三区免费观看| 五月天av在线| 亚洲成av人片一区二区密柚| 成人午夜国产| 欧美亚洲国产精品久久| 欧美成人午夜| 中文国产一区| 亚洲综合专区| 伊人国产精品| 国产伦乱精品| 精品久久影院| 欧美日韩一区二区综合| 国产视频一区三区| 日本不卡一二三区黄网| 国产精品一区二区三区av| 狠狠久久伊人中文字幕| 精品成人18| 成人午夜国产| 91高清一区| 亚洲精品看片| 国产日产高清欧美一区二区三区| 久久成人高清| 久久香蕉国产| 国产亚洲亚洲| 国产剧情在线观看一区| 福利片在线一区二区| 国产一区视频在线观看免费| 免费在线观看视频一区| 国产精品久久久久久久久久白浆 | 欧美日韩国产高清| 亚洲欧美高清| 国产日韩欧美| 日韩国产欧美一区二区| 国产视频一区三区| 你懂的亚洲视频| 亚洲精品在线观看91| 老鸭窝毛片一区二区三区| 91精品国产自产精品男人的天堂| 国产suv精品一区| 香蕉精品视频在线观看| 国产三级精品三级在线观看国产| 日韩成人a**站| 一区免费视频| 美女视频黄免费的久久| 亚洲欧美伊人| 国产亚洲一区二区三区啪| 日韩1区2区| 免费看黄色91| 欧美天堂视频| 日韩精品成人在线观看| 精品丝袜在线| 久久99伊人| 久久精品欧洲| 亚洲一区日本| 国产va免费精品观看精品视频| 国产午夜精品一区二区三区欧美| 麻豆一区二区三区| 美女被久久久| 国产a亚洲精品| 日本v片在线高清不卡在线观看| 日韩国产一区二区三区| 欧美三区不卡| 夜夜嗨一区二区| 国产精品99一区二区三| 日韩国产一二三区| 欧美成人国产| 国产剧情一区| 久久大逼视频| 日韩在线综合| 麻豆国产精品视频| 日韩精品免费视频一区二区三区 | 一本综合精品| 九九精品调教| 欧美国产免费| 午夜电影一区| 亚洲一卡久久| 日韩精品电影| 久久99国产精品视频| 日本va欧美va瓶| 欧美精品一区二区三区精品| 精品中文在线| 青青国产精品| 亚洲精品黄色| 亚洲在线国产日韩欧美| 99久久亚洲精品蜜臀| 日韩av在线播放网址| 国产精品xvideos88| 亚洲专区视频| 亚洲一区中文| 欧美福利在线| 久久精品影视| 激情中国色综合| 国产探花一区在线观看| 亚州精品视频| 视频一区二区三区在线| 亚洲二区精品| 亚洲精品在线影院| 日韩av二区| 国产成人精品一区二区三区免费 | 在线国产一区二区| 91精品久久久久久久久久不卡| 精品国产成人| 麻豆久久久久久久| 欧美日韩一区二区三区四区在线观看 | 欧美日韩激情在线一区二区三区| 97视频热人人精品免费| 精品亚洲精品| 久久99久久久精品欧美| 国产精品xxx| 国产精品亚洲欧美一级在线| 日韩激情视频网站| 免费在线观看日韩欧美| 视频一区免费在线观看| 人人精品人人爱| 亚洲免费福利一区| 亚洲青青久久| 日韩二区在线观看| 国产欧美日韩一级| 麻豆精品在线播放| 国产一区日韩| 日韩av免费大片| 婷婷综合六月| 亚洲一级影院| 亚洲少妇在线| 日产欧产美韩系列久久99| 欧美一级久久| 欧美亚洲自偷自偷| 免费视频一区二区三区在线观看| 精品国产欧美日韩| 欧洲亚洲一区二区三区| 午夜视频精品| 亚洲18在线| 国产精品毛片视频| 久久亚洲国产精品尤物| 久久电影tv| 亚洲午夜在线| 免费日韩av片| 久久精品97| 日韩.com| 亚洲激情偷拍| 日韩精品亚洲专区| 国产精品久久国产愉拍| 肉色欧美久久久久久久免费看| 狠狠爱成人网| 91成人小视频| 成人欧美一区二区三区的电影| 亚洲精品极品少妇16p| 日韩一区二区三区精品 | 中文字幕av一区二区三区四区| 日韩一区二区三免费高清在线观看| 国产日韩1区| 日韩电影免费网站| 亚洲综合另类| 欧美亚洲一区二区三区| av日韩中文| 首页欧美精品中文字幕| 国产精品亚洲综合色区韩国 | 精品色999| 亚洲黄页一区| 国产无遮挡裸体免费久久| 在线看片福利| 免费日韩视频| 久草精品视频| 亚洲一区日韩| 精品视频网站| 亚洲欧美日韩专区| 久久国产精品免费一区二区三区| 国产成人免费| 男女男精品视频网| 国产一区二区亚洲| 久久不射中文字幕| 精品视频自拍| 视频一区国产视频| 国产一区国产二区国产三区| 免费国产自线拍一欧美视频| 欧美黑人做爰爽爽爽| 蜜桃视频欧美| 国产精品天天看天天狠| 亚洲精品国产偷自在线观看| 国产精品magnet| 蜜桃国内精品久久久久软件9| 日本v片在线高清不卡在线观看| 日本一二区不卡| 亚洲精品免费观看| 伊人久久在线| 日韩国产欧美在线视频| 欧美日韩水蜜桃| 国产高清日韩| 日韩中文字幕一区二区三区| 91中文字幕精品永久在线| 日本免费一区二区视频| 不卡在线一区| 中文字幕在线官网| 国产毛片精品久久|