校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 如何使用Serializable接口來自定義PHP中類的序列化

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

熱門標簽:衡水外呼系統平臺 百度商鋪地圖標注 安裝電銷外呼系統 注冊400電話申請 福州人工外呼系統哪家強 常州地圖標注服務商 地圖標注平臺怎么給錢注冊 釘釘打卡地圖標注 新河科技智能外呼系統怎么樣

關于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:\"\0B\0data\";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:\"\0D\0data\";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:\"\0D\0data\";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自定義序列化接口Serializable用法分析

標簽:克拉瑪依 唐山 鶴崗 白城 鷹潭 柳州 六安 遼陽

巨人網絡通訊聲明:本文標題《如何使用Serializable接口來自定義PHP中類的序列化》,本文關鍵詞  如何,使用,Serializable,接口,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何使用Serializable接口來自定義PHP中類的序列化》相關的同類信息!
  • 本頁收集關于如何使用Serializable接口來自定義PHP中類的序列化的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    高清不卡一二三区| 日韩精品色哟哟| 久久久精品免费网站| 亚洲成a人v欧美综合天堂| 欧美性xxxxxx少妇| 国产高清不卡一区| 精品一区二区影视| 成人午夜激情视频| 色诱视频网站一区| 欧美性xxxxxxxx| 欧美性猛片xxxx免费看久爱| 日韩欧美国产小视频| 欧美亚洲动漫精品| 粉嫩av一区二区三区| 国产精品久久国产精麻豆99网站| 欧美精品自拍偷拍动漫精品| 欧美日韩电影在线播放| 欧美日韩中字一区| 欧美综合欧美视频| 日本伊人色综合网| 99精品欧美一区| 粉嫩av一区二区三区粉嫩| 亚洲天堂a在线| 久久se精品一区精品二区| 亚洲国产乱码最新视频 | 91原创在线视频| 日韩一区二区精品| 国产精品久久久久天堂| 日本成人在线一区| 在线亚洲免费视频| 一区二区免费在线| 欧美亚洲综合在线| 欧美日韩精品一区二区天天拍小说 | 国产精品综合网| 欧美精品三级在线观看| 亚洲综合色噜噜狠狠| av爱爱亚洲一区| 2021中文字幕一区亚洲| 日韩av电影免费观看高清完整版 | 国精产品一区一区三区mba视频 | 婷婷开心激情综合| 欧美美女直播网站| 亚洲国产乱码最新视频| 欧美精品日韩综合在线| 日本欧美在线观看| 亚洲精品在线一区二区| 不卡在线视频中文字幕| 日韩国产精品久久| 国产欧美日产一区| 欧洲一区在线电影| 日本aⅴ精品一区二区三区| 欧美高清www午色夜在线视频| 日本不卡1234视频| 国产日韩影视精品| 在线一区二区三区四区五区| 日韩av电影免费观看高清完整版| 精品少妇一区二区三区在线播放 | 欧美大片顶级少妇| 日韩中文字幕1| 日韩一区二区视频在线观看| 午夜精品久久久久久久久| 日韩一区二区精品葵司在线| 日本午夜一区二区| 欧美一区二区三区在线电影 | 欧美色综合天天久久综合精品| 久久精品欧美日韩精品| 成人黄色大片在线观看| 亚洲一区二区欧美日韩| 欧美疯狂性受xxxxx喷水图片| 亚洲欧美日韩精品久久久久| 亚洲国产成人91porn| 亚洲国产视频在线| 一区二区中文字幕在线| 久久亚洲一区二区三区明星换脸 | 亚洲一区二区三区三| 国产精品久久久久久一区二区三区| 欧美日韩精品福利| 欧美日韩一区国产| 欧美日韩一卡二卡| 日韩你懂的在线播放| 日韩一卡二卡三卡四卡| 欧美福利一区二区| 日韩欧美国产一区二区三区| 日韩一区二区三区电影在线观看| 91精品免费在线| 欧美成人三级电影在线| 久久综合色婷婷| 亚洲欧美国产77777| 午夜精品福利一区二区三区av | 久久久蜜臀国产一区二区| 日韩一区二区在线播放| 精品精品国产高清a毛片牛牛| 精品国产一区二区三区四区四| 欧美日韩精品一区二区三区| 欧美人xxxx| 精品国产一区二区三区久久影院 | 欧美精品一区二区精品网| 91小视频免费观看| 91黄色小视频| 欧美日韩激情一区二区三区| 日韩亚洲国产中文字幕欧美| 在线看不卡av| 91精品欧美一区二区三区综合在| 在线视频你懂得一区| 欧美日韩国产天堂| 日韩精品中文字幕在线一区| 亚洲色图制服诱惑 | 色狠狠一区二区| 欧美日韩国产成人在线91| 中文字幕亚洲成人| 国产乱码字幕精品高清av| 91久久奴性调教| 国产精品久线观看视频| 久久99久久精品| 91久久线看在观草草青青| 精品国产a毛片| 亚洲一区二区在线视频| 国产剧情一区二区| 日韩欧美激情在线| 亚洲精品久久久蜜桃| 蜜桃av一区二区| 欧美三级蜜桃2在线观看| 一色屋精品亚洲香蕉网站| 亚洲国产一区二区a毛片| 国产一区二区三区四区在线观看| 8x8x8国产精品| 国产精品一区二区免费不卡| 欧美人伦禁忌dvd放荡欲情| 自拍视频在线观看一区二区| 国产一区二区免费在线| 久久久精品tv| 欧美亚一区二区| 天堂一区二区在线免费观看| eeuss国产一区二区三区| 日韩在线观看一区二区| 麻豆成人91精品二区三区| 欧美激情一区二区三区| 在线电影一区二区三区| 91天堂素人约啪| 国产一区二区三区四区五区美女 | 日韩电影在线一区| 精品99一区二区| 色婷婷久久99综合精品jk白丝| 国产精品久久久久久久久果冻传媒 | 欧美性大战久久久久久久蜜臀| 亚洲九九爱视频| 国产精品成人在线观看| 日韩欧美你懂的| 欧美精品日韩一本| 色综合一区二区| 成人毛片在线观看| 久久精品99国产精品日本| 精品久久一区二区| 91麻豆国产在线观看| 午夜精品福利久久久| 26uuu国产在线精品一区二区| 欧美一级xxx| 国产欧美一区二区精品仙草咪| 国产凹凸在线观看一区二区| 国产成人鲁色资源国产91色综 | 91成人国产精品| 国产乱码字幕精品高清av| 亚洲第一综合色| 亚洲女人小视频在线观看| 国产精品久久久久影院| 日韩一区二区三区在线视频| 不卡的av中国片| 国产伦理精品不卡| 午夜精品aaa| 国产精品乱码一区二三区小蝌蚪| 精品剧情v国产在线观看在线| 欧美综合欧美视频| 国产在线精品一区二区不卡了| 自拍偷在线精品自拍偷无码专区| 亚洲欧美视频在线观看| 国产精品99久久久久久似苏梦涵 | 欧美亚洲禁片免费| 成人自拍视频在线观看| www.av亚洲| 欧美日韩激情在线| 精品久久久久久久久久久久包黑料| 欧美变态tickling挠脚心| 久久综合九色综合欧美就去吻| 欧美激情一区二区三区四区| 日韩视频一区二区三区| 国产偷国产偷精品高清尤物| 亚洲一级在线观看| 国产一区二区在线观看视频| 日韩精品色哟哟| 色综合中文字幕| 久久久久久久综合| 午夜精品久久久久久久99水蜜桃| 国产白丝精品91爽爽久久| 欧美精品自拍偷拍| 亚洲国产wwwccc36天堂| 99国产精品视频免费观看| 精品国产乱码久久久久久闺蜜| 一区av在线播放| 欧美亚洲日本一区| 一区二区三区毛片|