關(guān)于PHP中的對象序列化這件事兒,之前我們在很早前的文章中已經(jīng)提到過__sleep()和__weakup()這兩個魔術(shù)方法。今天我們介紹的則是另外一個可以控制序列化內(nèi)容的方式,那就是使用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 接口來進行序列化處理的,注意一點哦,實現(xiàn)了 Serializable 接口的類中的 __sleep() 和 __weakup() 魔術(shù)方法就無效了哦,序列化的時候不會進入它們。
Serializable 這個接口需要實現(xiàn)的是兩個方法,serialize() 方法和 unserialize() 方法,是不是和那兩個魔術(shù)方法完全一樣。當(dāng)然,使用的方式也是一樣的。
在這里,我們多普及一點序列化的知識。對象序列化只能序列化它們的屬性,不能序列化他們方法。如果當(dāng)前能夠找到對應(yīng)的類模板,那么可以還原出這個類的方法來,如果沒有定義過這個類的模板,那么還原出來的類是沒有方法只有屬性的。我們通過這段代碼中的序列化字符串來分析:
- "C:",指的是當(dāng)前數(shù)據(jù)的類型,這個我面后面還會講,實現(xiàn) Serializable 接口的對象序列化的結(jié)果是 C: ,而沒有實現(xiàn)這個接口的對象序列化的結(jié)果是 O:
- "A:",很明顯對應(yīng)的是類名,也就是類的::class
- "{xxx}",對象結(jié)構(gòu)和JSON一樣,也是用的花括號
各種類型的數(shù)據(jù)進行序列化的結(jié)果
下面我們再來看下不同類型序列化的結(jié)果。要知道,在PHP中,我們除了句柄類型的數(shù)據(jù)外,其他標(biāo)量類型或者是數(shù)組、對象都是可以序列化的,它們在序列化字符串中是如何表示的呢?
$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;}"
上面的內(nèi)容還是比較好理解的吧。不過我們還是一一說明一下:
-
數(shù)字類型:i:<值>
-
字符串類型:s:<長度>:<值>
-
布爾類型:b:<值:0或1>
-
NULL類型:N;
-
數(shù)組:a:<長度>:<內(nèi)容>
對象在使用Serializable接口序列化時要注意的地方
接下來,我們重點講講對象類型,上面已經(jīng)提到過,實現(xiàn) Serializable 接口的對象序列化后的標(biāo)識是有特殊情況的。上方序列化后的字符串開頭類型標(biāo)識為 "C:",那么我們看看不實現(xiàn) Serializable 接口的對象序列化后是什么情況。
// 正常對象類型序列化的結(jié)果 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:" 主站蜘蛛池模板: 国产精品欧美亚洲韩国日本久久| 3级黄性日本午夜精品| 国产午夜精品理论片免费观看| 3级黄性日本午夜精品| 91精品国产91久久| 99热成人精品免费久久| 精品国产福利尤物免费| 中文字幕久久精品无码| 亚洲av无码成人精品区在线播放 | 久久国产精品一区| 中文字幕精品一区| 久久er99热精品一区二区| 久久91综合国产91久久精品| 久久97久久97精品免视看秋霞| 精品无人区一区二区三区| 99亚洲精品视频| 久久久无码精品亚洲日韩按摩 | 欧美日韩精品在线观看| 国产最新进精品视频| 亚洲国产精品久久久天堂| 91av国产精品| 国产精品电影网| 精品亚洲成a人片在线观看 | 亚洲国产午夜中文字幕精品黄网站| 国产精品嫩草视频永久网址| 国产成人精品一区在线| 国产精品一区二区久久精品| 久久久久人妻一区精品性色av| 国产精品无码久久四虎| 正在播放酒店精品少妇约| 久久亚洲精品成人AV| 日韩精品视频一区二区三区| 91精品福利在线观看| 91视频精品全国免费观看| 精品国际久久久久999波多野| 一本一本久久A久久综合精品 | 99re6在线视频精品免费| 午夜精品久久久久久久久| 亚洲精品无码MV在线观看| 亚洲AV乱码久久精品蜜桃| 亚洲国产另类久久久精品黑人|