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

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

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

瀏覽:47日期: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 接口的類 才能反序列化成功。

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

總結

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

測試代碼:

github.com/zhangyue050…

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

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆成人av在线| 日韩av在线播放网址| 久久高清免费| 久久九九国产| 在线国产一区二区| 中文不卡在线| 91麻豆精品| 国产香蕉精品| 国产激情在线播放| 久久精品123| 天堂8中文在线最新版在线| 91亚洲国产| 韩日一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美精品国产| 久久精品资源| 日韩精品永久网址| 精品1区2区3区4区| 日本综合精品一区| 岛国av免费在线观看| 久久国产精品成人免费观看的软件| 欧美一级鲁丝片| 视频一区二区三区入口| 国产精品高清一区二区| 国产在线看片免费视频在线观看| 香蕉精品久久| 青青草国产精品亚洲专区无| 另类专区亚洲| 亚洲18在线| 国产成人1区| 亚洲一区网站| 久久久久九九精品影院| 国产在线日韩| 国产精品资源| 一区视频在线| 麻豆精品视频在线观看免费| 久久九九国产| 久久国产三级| 亚洲成人免费| 国产精品久久久久久妇女| 日韩欧美三级| 人人爱人人干婷婷丁香亚洲| 日韩av福利| 久久精品99久久久| 亚洲手机在线| 精品中国亚洲| 蜜桃久久久久久久| 日韩一区二区三区免费| 91大神在线观看线路一区| 日本精品在线中文字幕| 久久精品 人人爱| 亚洲h色精品| 国产精品亚洲二区| 蜜桃伊人久久| 丝袜av一区| 国产精品99久久久久久董美香| 欧美日韩三区| 国产高潮在线| 国产亚洲久久| 丝袜美腿一区二区三区| 福利一区在线| 国产精品最新自拍| 玖玖精品视频| 亚洲二区免费| 亚洲三区欧美一区国产二区| 色爱综合av| 久久激情综合网| 蜜臀久久99精品久久久久久9| 日韩中文影院| 久久亚洲精精品中文字幕| 免播放器亚洲一区| 免费精品国产的网站免费观看| 国产一区二区三区视频在线| 欧美久久香蕉| 日韩三区四区| 亚洲午夜免费| 亚洲免费网址| 欧美日韩在线网站| 亚洲www啪成人一区二区| 久久99国产精品视频| 欧美亚洲tv| 一区二区三区四区日韩| 欧美美女一区| 久久久久国产| 日韩精品久久久久久久电影99爱| 国产一区国产二区国产三区| 国产精品a级| 国产精品久久久久久久免费软件| 欧美伊人影院| 91欧美极品| 欧美日本精品| 国产精品对白| 久久av网址| 精品视频97| 日本欧美国产| 日韩激情一区| 免费福利视频一区二区三区| 一区二区三区四区日本视频| av中文资源在线资源免费观看| 国产精品原创| 久久久久久美女精品| 激情婷婷亚洲| av不卡在线| 日韩精品一卡二卡三卡四卡无卡| 久热re这里精品视频在线6| 亚洲欧美日韩高清在线| 国产精品91一区二区三区| 亚洲激情av| 一区二区三区国产盗摄| 日本伊人午夜精品| 国产剧情一区| 精品一区av| 一区二区精品伦理...| 久久久水蜜桃av免费网站| 四虎国产精品免费观看| 日本精品不卡| 乱人伦精品视频在线观看| 亚洲一区二区三区中文字幕在线观看 | 先锋影音国产一区| 亚洲精品看片| 欧美精品不卡| 麻豆高清免费国产一区| 黄色在线观看www| 欧美va亚洲va日韩∨a综合色| 午夜免费一区| 一区二区日韩免费看| 国产麻豆精品| 日韩在线高清| 中文字幕日韩高清在线| 国产欧美综合一区二区三区| 高清精品久久| 91精品成人| 欧美日韩亚洲一区| 在线天堂中文资源最新版| 在线亚洲激情| 国产精品美女在线观看直播| 日本少妇一区| 蜜桃久久av一区| 久久影院一区二区三区| 久久视频一区| 亚洲日本久久| 97在线精品| 日韩在线观看一区二区| 久久不见久久见免费视频7| 久久国产亚洲| 日本欧美韩国一区三区| 久久天堂精品| 91亚洲无吗| 99tv成人| 国产色噜噜噜91在线精品| 久久理论电影| 久久av资源| 99热免费精品| 精品一区二区三区中文字幕视频 | 日韩免费av| 日韩中文字幕无砖| 亚洲四虎影院| 国产视频一区二区在线播放| 色婷婷久久久| 国产视频网站一区二区三区| 视频一区中文| 精品国产欧美日韩| 亚洲一二三区视频| 麻豆网站免费在线观看| 亚洲aa在线| 在线成人直播| 欧美男人天堂| 国产日本精品| 欧美aa国产视频| 久久99国产精品视频| 亚洲精选久久| 欧美.日韩.国产.一区.二区 | 久久精品主播| 麻豆久久久久久久| 婷婷精品在线观看| 日韩欧美一区二区三区在线观看 | 天海翼精品一区二区三区| 色爱av综合网| 久久精品国产久精国产| 日韩高清不卡一区| 亚洲欧美日韩国产综合精品二区 | 国精品一区二区三区| 久久99久久久精品欧美| 亚洲精品第一| 蜜桃一区二区三区在线观看| 欧美日韩国产一区二区三区不卡| 麻豆mv在线观看| 国产一区二区三区亚洲| 久久wwww| 美女av一区| 欧美影院视频| 免费精品视频在线| 国产精品日本| 国产精品日本| 婷婷成人综合| 久久免费国产| 欧美精品资源| 国语精品一区| 国产精品美女在线观看直播 | 欧美综合社区国产|