电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:39日期:2022-09-07 15:59:21

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

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:'0B0data';s:15:'This is Class B';}'));// object(B)#4 (1) {// ['data':'B':private]=>string(15) 'This is Class B'// }

果然,它開(kāi)頭的類型標(biāo)識(shí)是 'O:'。那么我們可以看出,'C:' 很大的概率指的是當(dāng)前序列化的內(nèi)容是一個(gè)類類型,不是一個(gè)對(duì)象類型。它們之間其實(shí)并沒(méi)有顯著的差異,包括官方文檔上也沒(méi)有找到特別具體的說(shuō)明。如果有過(guò)這方面的研究或者有相關(guān)資料的同學(xué)可以評(píng)論留言一起討論哈。

此外,如果我們手動(dòng)將一個(gè)對(duì)象的 'O:' 轉(zhuǎn)成 'C:' 會(huì)怎么樣呢?

// 把O:替換成C:var_dump(unserialize(str_replace(’O:’, ’C:’, $bSerialize))); // false

抱歉,無(wú)法還原了。那么我們反過(guò)來(lái),將上面 A 類也就是實(shí)現(xiàn)了 Serializable 接口的序列化字符串中的 'C:' 轉(zhuǎn)成 'O:' 呢?

// Warning: Erroneous data format for unserializing ’A’var_dump(unserialize(str_replace(’C:’, ’O:’, $aSerialize))); // false

嗯,會(huì)提示一個(gè)警告,然后同樣也無(wú)法還原了。這樣看來(lái),我們的反序列化還是非常智能的,有一點(diǎn)點(diǎn)的不同都無(wú)法進(jìn)行還原操作。

未定義類的反序列化操作

最后,我們來(lái)看看未定義類的情況下,直接反序列化一個(gè)對(duì)象。

// 模擬一個(gè)未定義的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:' 類型的字符串依然無(wú)法反序列化成功。劃重點(diǎn)哦,如果是C:開(kāi)頭的序列化字符串,一定需要是定義過(guò)的且實(shí)現(xiàn)了 Serializable 接口的類 才能反序列化成功。

另外,我們可以發(fā)現(xiàn),當(dāng)序列化字符串中的模板不存在時(shí),反序列化出來(lái)的類的類名是 __PHP_Incomplete_Class_Name 類,不像有類模板的反序列化成功直接就是正常的類名。

總結(jié)

其實(shí)從以上各種來(lái)看,個(gè)人感覺(jué)如果要保存數(shù)據(jù)或者傳遞數(shù)據(jù)的話,序列化并不是最好的選擇。畢竟包含了類型以及長(zhǎng)度后將使得格式更為嚴(yán)格,而且反序列化回來(lái)的內(nèi)容如果沒(méi)有對(duì)應(yīng)的類模板定義也并不是特別好用的,還不如直接使用 JSON 來(lái)得方便易讀。當(dāng)然,具體情況具體分析,我們還是要結(jié)合場(chǎng)景來(lái)選擇合適的使用方式。

測(cè)試代碼:

github.com/zhangyue050…

以上就是如何使用Serializable接口來(lái)自定義PHP中類的序列化的詳細(xì)內(nèi)容,更多關(guān)于自定義PHP中類的序列化的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 传爱自考网_传爱自学考试网 | 万博士范文网-您身边的范文参考网站Vanbs.com | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 餐饮加盟网_特色餐饮加盟店_餐饮连锁店加盟 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 |