久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      如何使用Serializable接口來(lái)自定義PHP中類的序列化

      關(guān)于PHP中的對(duì)象序列化這件事兒,之前我們?cè)诤茉缜暗奈恼轮幸呀?jīng)提到過(guò)__sleep()和__weakup()這兩個(gè)魔術(shù)方法。今天我們介紹的則是另外一個(gè)可以控制序列化內(nèi)容的方式,那就是使用Serializable接口。

      如何使用Serializable接口來(lái)自定義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 接口來(lái)進(jìn)行序列化處理的,注意一點(diǎn)哦,實(shí)現(xiàn)了 Serializable 接口的類中的 __sleep() 和 __weakup() 魔術(shù)方法就無(wú)效了哦,序列化的時(shí)候不會(huì)進(jìn)入它們。

      Serializable 這個(gè)接口需要實(shí)現(xiàn)的是兩個(gè)方法,serialize() 方法和 unserialize() 方法,是不是和那兩個(gè)魔術(shù)方法完全一樣。當(dāng)然,使用的方式也是一樣的。

      在這里,我們多普及一點(diǎn)序列化的知識(shí)。對(duì)象序列化只能序列化它們的屬性,不能序列化他們方法。如果當(dāng)前能夠找到對(duì)應(yīng)的類模板,那么可以還原出這個(gè)類的方法來(lái),如果沒(méi)有定義過(guò)這個(gè)類的模板,那么還原出來(lái)的類是沒(méi)有方法只有屬性的。我們通過(guò)這段代碼中的序列化字符串來(lái)分析:

      • "C:",指的是當(dāng)前數(shù)據(jù)的類型,這個(gè)我面后面還會(huì)講,實(shí)現(xiàn) Serializable 接口的對(duì)象序列化的結(jié)果是 C: ,而沒(méi)有實(shí)現(xiàn)這個(gè)接口的對(duì)象序列化的結(jié)果是 O:
      • "A:",很明顯對(duì)應(yīng)的是類名,也就是類的::class
      • "{xxx}",對(duì)象結(jié)構(gòu)和JSON一樣,也是用的花括號(hào)

      各種類型的數(shù)據(jù)進(jìn)行序列化的結(jié)果

      下面我們?cè)賮?lái)看下不同類型序列化的結(jié)果。要知道,在PHP中,我們除了句柄類型的數(shù)據(jù)外,其他標(biāo)量類型或者是數(shù)組、對(duì)象都是可以序列化的,它們?cè)谛蛄谢址惺侨绾伪硎镜哪兀?/p>

      $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)容還是比較好理解的吧。不過(guò)我們還是一一說(shuō)明一下:

      • 數(shù)字類型:i:<值>

      • 字符串類型:s:<長(zhǎng)度>:<值>

      • 布爾類型:b:<值:0或1>

      • NULL類型:N;

      • 數(shù)組:a:<長(zhǎng)度>:<內(nèi)容>

      對(duì)象在使用Serializable接口序列化時(shí)要注意的地方

      接下來(lái),我們重點(diǎn)講講對(duì)象類型,上面已經(jīng)提到過(guò),實(shí)現(xiàn) Serializable 接口的對(duì)象序列化后的標(biāo)識(shí)是有特殊情況的。上方序列化后的字符串開(kāi)頭類型標(biāo)識(shí)為 "C:",那么我們看看不實(shí)現(xiàn) Serializable 接口的對(duì)象序列化后是什么情況。

      // 正常對(duì)象類型序列化的結(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:"