站長資訊網
        最全最豐富的資訊網站

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

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

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

        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:"
        
        主站蜘蛛池模板:
        国产精品毛片无码|
        一级做a爰黑人又硬又粗免费看51社区国产精品视
        |
        国产成人精品男人的天堂538|
        日韩精品一二三区|
        337P亚洲精品色噜噜|
        国产第一福利精品导航|
        亚洲综合精品网站在线观看|
        国产精品自在欧美一区|
        久久精品国产亚洲麻豆|
        久久精品国产亚洲AV嫖农村妇女|
        日韩经典精品无码一区|
        国产欧美日韩综合精品一区二区三区|
        91精品全国免费观看青青|
        亚洲精品无码AV人在线播放
        |
        欧美精品xxxxbbbb|
        国产精品美女久久久久av爽|
        免费欧美精品a在线|
        91精品全国免费观看青青|
        国产精品日本一区二区在线播放|
        亚洲国产精品无码久久九九|
        国产精品自在欧美一区|
        国产A∨免费精品视频|
        亚洲精品视频在线|
        日本精品不卡视频|
        国产日韩一区在线精品欧美玲|
        国产精品免费看久久久|
        久久综合久久自在自线精品自|
        亚洲国产主播精品极品网红
        |
        国产精品亚洲精品观看不卡|
        97视频在线观看这里只有精品|
        久久精品99久久香蕉国产色戒|
        无码人妻精品中文字幕免费|
        最新精品露脸国产在线|
        精品国产三级a乌鸦在线观看|
        99精品福利国产在线|
        亚洲国产精品一区|
        99精品国产福利在线观看|
        国产69精品久久久久9999|
        国产精品玖玖美女张开腿让男人桶爽免费看|
        91精品国产福利在线观看麻豆|
        91麻豆精品一二三区在线|