摘要:在寫序列化與反序列化時,我們先來看看產生一個可存儲的值的表示描述返回字符串,此字符串包含了表示的字節流,可以存儲于任何地方。想要將已序列化的字符串變回的值,可使用。當序列化對象時,將試圖在序列動作之前調用該對象的成員函數。
在寫序列化serialize與反序列化unserialize()時,我們先來看看:
serialize — 產生一個可存儲的值的表示
描述
string serialize ( mixed $value )
serialize() 返回字符串,此字符串包含了表示 value 的字節流,可以存儲于任何地方。
這有利于存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
想要將已序列化的字符串變回 PHP 的值,可使用 unserialize()。serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數組。你正 serialize() 的數組/對象中的引用也將被存儲。
當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數 __sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 __wakeup() 成員函數。
個人實際項目中的理解
序列化serialize()就是可以將多個字段的值如 name、vaule、sex、money等存儲在數據庫表中一個字段里如extend_params,而不用另外開辟那么多字段,使用的時候就要先反序列化extend_params
上代碼
下面的代碼是我在簾易購項目中計價算法中用到的(ECShop)
/** * 添加定制商品到購物車 */ public function add_customizationOp() { if (floatval($_POST["width"]) <= 0 || floatval($_POST["height"]) <= 0 || floatval($_POST["c_height"]) <= 0) { echo "請選擇正確的尺寸"; exit; } $goods = Model()->table("goods,goods_common")->join("left")->on("goods.goods_commonid = goods_common.goods_commonid")->where(array("goods_common.goods_commonid" => array("in", $_POST["goods"])))->select(); if (empty($goods)) { echo "請選擇好合適的款式面料"; exit; } $class = $this->_get_class_list(1573); $gc_array = array(); foreach ($class as $val) { $gc_array[$val["gc_id"]] = $val["gc_name"]; } foreach ($goods as $key => $val) { if ($val["gc_id"] == 1574) { $ratio = unserialize($val["ratio"]); break; } } if (empty($ratio) || empty($goods)) { echo "請選擇好合適的款式面料"; exit; } $extend_params["width"] = floatval($_POST["width"]); $extend_params["height"] = floatval($_POST["height"]); $extend_params["c_height"] = floatval($_POST["c_height"]); $extend_params["hl"] = floatval($_POST["hl"]); $extend_params["settle"] = " 計價類型:特別定制"; if (isset($_POST["pay_message"]) && !empty($_POST["pay_message"])) { $extend_params["pay_message"] = trim($_POST["pay_message"]); } $insert_array = array(); $extend_params["total_price"] = 0; $count = count($goods); $i = 1; $sum = 0; $item_id = time() . rand(1000, 9999); foreach ($goods as $val) { if ($val["gc_id"] == 1574 || (isset($ratio[$val["gc_id"]]) && !empty($ratio[$val["gc_id"]]) && intval($ratio[$val["gc_id"]]) > 0)) { if ($val["goods_storage"] - $_POST["quantity"] < 0) { echo $val["goods_name"] . "庫存不足"; exit; } else { $param["goods_num"] = $_POST["quantity"]; } if ($val["gc_id"] == 1574) { $param["goods_price"] = $val["goods_price"] * $extend_params["width"]; }elseif($val["gc_id"] == 1589||$val["gc_id"] == 1590){ $param["goods_price"] = $val["goods_price"] * floatval($ratio[$val["gc_id"]]) / 100; } else { $extend_params["mianliao"] = $gc_array[$val["gc_id"]]; $param["goods_price"] = $val["goods_price"] * $extend_params["width"] * floatval($ratio[$val["gc_id"]]) / 100; } if ($extend_params["height"] - 0.6 > 0) { $param["goods_price"] = $param["goods_price"] * $extend_params["height"] / 0.45; } $sum += $param["goods_price"]; if ($i == $count) { $extend_params["num"] = $count; $extend_params["sum"] = sprintf("%.2f", $sum); } $param["goods_price"] = sprintf("%.2f", $param["goods_price"]); $param["buyer_id"] = $this->member_info["member_id"]; $param["store_id"] = $this->member_info["bd_store_id"]; $param["goods_id"] = $val["goods_id"]; $param["goods_name"] = $val["goods_name"]; $param["type"] = 2; $param["customization_id"] = $item_id; $param["goods_image"] = $val["goods_image"]; $param["store_name"] = $val["store_name"]; $param["extend_params"] = serialize($extend_params); //重點 $insert_array[] = $param; unset($extend_params["mianliao"]); $i++; } } //日志 $da["f_id"]=$count; $da["f_name"]=json_encode($ratio); $da["f_ip"]="11"; $da["t_id"]=$i; $da["t_name"]="111"; $da["t_msg"]=json_encode($goods); $da["add_time"]=time(); Model()->table("chat_log")->insert($da); $res = Model()->table("cart")->insertAll($insert_array); if ($res) { echo 1; exit; } else { echo "添加失敗"; exit; } }
關鍵
$param["extend_params"] = serialize($extend_params); //重點
序列化效果
a:5:{s:5:"width";s:1:"2";s:6:"height";s:1:"0";s:11:"pay_message";s:6:"書房";s:11:"goods_price";s:5:"28.00";s:6:"settle";s:22:" 計價類型:定制";}
看到這里就知道serialize()作用性的了
那下面就來看看 是怎么用到unserialize()
/**
* 購物車列表 */ public function cart_listOp() { $model_cart = Model("cart"); $condition = array("buyer_id" => $this->member_info["member_id"]); $cart_list = $model_cart->listCart("db", $condition); $sum = 0; //商品總價 $num = 0; //商品數量 $all_click = 3; //是否全選 if (isset($_GET["height"])) { Tpl::output("height", intval($_GET["height"])); } else { Tpl::output("height", 0); } foreach ($cart_list as $key => $value) { if (!empty($value["extend_params"])) { $extend_params = unserialize($value["extend_params"]); //重點 $value["extend_params1"] = ""; $value["extend_params2"] = ""; if (isset($extend_params["settle"])) { $value["extend_params1"] .= $extend_params["settle"]; } if (isset($extend_params["width"]) && floatval($extend_params["width"]) > 0) { $value["extend_params1"] .= " 寬度:" . floatval($extend_params["width"]) . "米"; } if (isset($extend_params["height"]) && floatval($extend_params["height"]) > 0) { $value["extend_params1"] .= " 高度:" . floatval($extend_params["height"]) . "米"; } if (isset($extend_params["c_height"]) && floatval($extend_params["c_height"]) > 0) { $value["extend_params1"] .= " 窗高:" . floatval($extend_params["c_height"]) . "米"; } if (isset($extend_params["hl"])) { if ($extend_params["hl"] == 1) { $value["extend_params2"] .= " 魔術貼:正面"; } else if ($extend_params["hl"] == 2) { $value["extend_params2"] .= " 魔術貼:反面"; } else if ($extend_params["hl"] == 3) { if (!isset($extend_params["mianliao"])) { $value["extend_params2"] .= "無魔術貼"; } } //定制商品 $cart_list[$key]["num"] = $extend_params["num"]; $cart_list[$key]["sum"] = $extend_params["sum"]; if (isset($extend_params["mianliao"])) { $value["extend_params2"] .= " " . $extend_params["mianliao"]; } } if (isset($extend_params["interfacing"])) { if ($extend_params["interfacing"] == 1) { $value["extend_params2"] .= " 襯布:遮光襯布"; } else if ($extend_params["interfacing"] == 2) { $value["extend_params2"] .= " 襯布:不遮光襯布"; } else if ($extend_params["interfacing"] == 0) { $value["extend_params2"] .= " 襯布:無襯布"; } } $cart_list[$key]["cunbucloth"] = $extend_params["cunbucloth"]; $cart_list[$key]["cunbumon"] = $extend_params["cunbumon"]; $cart_list[$key]["pay_message"] = $extend_params["pay_message"]; $cart_list[$key]["extend_params1"] = $value["extend_params1"]; $cart_list[$key]["extend_params2"] = $value["extend_params2"]; $cart_list[$key]["goods_sum"] = ncPriceFormat($extend_params["sum"] * $value["goods_num"]); if($extend_params["sum"]){ $cart_list[$key]["goods_sum"] = ncPriceFormat($extend_params["sum"] * $value["goods_num"]); }else{ $cart_list[$key]["goods_sum"] = ncPriceFormat($value["goods_price"] * $value["goods_num"]); } } $cart_list[$key]["goods_image_url"] = cthumb($value["goods_image"], $value["store_id"]); $cart_list[$key]["goods_price"] = $value["goods_price"]; $cart_list[$key]["quantity"] = $value["goods_num"]; //單筆訂單購買的產品數量 $cart[] = $cart_list[$key]; if ($value["click"] == 1) { $sum += $cart_list[$key]["goods_sum"]; $num += $cart_list[$key]["goods_num"]; } else { $all_click = 2; } }
// dump($cart);
// exit(-1);
Tpl::output("cart", $cart); Tpl::output("all_click", $all_click); Tpl::output("num", $num); Tpl::output("sum", ncPriceFormat($sum)); Tpl::showpage("cart"); }
重點
$extend_params = unserialize($value["extend_params"]); //重點
下面你就可以直接用$extend_params 來定位到你需要的數據了
總結
項目做不要怕Bug,要敢于面對它并把它真正的解決,當我做這個項目的時候,我并不是很清楚地知道序列化和反序列化的真正用法,我是先序列化了,然后要用的時候沒有序列化,而直接去 $value["extend_params"]["sum"]這樣去找,所以它是找不到數據的,后來經過反復試錯,我懂得了得反序列化它,然后就可以直接這樣用$extend_params["sum"],故接觸得多,懂得也就多啦,不用怕自己現在很多都不會,重要的是自己肯去接觸肯去理解
注:文章來源雨中笑記錄實習期遇到的問題與心得,轉載請申明原文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30841.html
摘要:實現里的安裝用法世界上最好的語言世界上最好的語言世界上最好的語言地址 Golang 實現 PHP里的 serialize() 、 unserialize() 安裝 go get -u github.com/techoner/gophp 用法 package main import ( fmt github.com/techoner/gophp/serialize )...
摘要:和函數這兩個是序列化和反序列化中數據的常用函數。序列化數組輸出結果反序列化輸出結果當數組值包含如雙引號單引號或冒號等字符時,它們被反序列化后,可能會出現問題。序列化反序列化但是編碼將增加字符串的長度。序列化數組輸出結果反序列化 序列化是將變量轉換為可保存或傳輸的字符串的過程;反序列化就是在適當的時候把這個字符串再轉化成原來的變量使用。這兩個過程結合起來,可以輕松地存儲和傳輸數據,使程序...
0.前言 本文為篤行日常學習記錄,web安全php漏洞系列。 對象的序列化和反序列化作用就不再贅述,php中序列化的結果是一個php自定義的字符串格式,有點類似json. 我們在任何語言中設計對象的序列化和反序列化都需要解決幾個問題 把某個對象序列化之后,序列化的結果有自描述的功能(從序列化的結果中知道這個對象的具體類型,知道類型還不夠,當然還需要知道這個類型所對應具體的值). 序列化時的權...
摘要:我把分為五個部分,,,,而其中是就是做一些類的介紹與相關的類在各自文章內,在介紹這些類之前,先介紹幾個接口數組式訪問接口只要實現了這個接口,就可以使得像那樣操作。只有內部的類用寫的類才可以直接實現接口代碼中使用或接口來實現遍歷。 我把SPL分為五個部分:Iterator,Classes,Exceptions,Datastructures,Function;而其中classes是就是做一...
摘要:序列化工具類序列化工具的序列化與反序列化使用實現序列化和反序列化反序列化時,必須要有默認構造函數,否則報錯使用序列化緩存此類分別包含序列化序列化序列化三種序列化方式。 序列化工具類 序列化即將對象序列化為字節數組,反序列化就是將字節數組恢復成對象。主要的目的是方便傳輸和存儲。 序列化工具類: public class SerializeUtil { private stati...
閱讀 1446·2021-09-22 15:43
閱讀 2161·2019-08-30 15:54
閱讀 1162·2019-08-30 10:51
閱讀 2087·2019-08-29 18:35
閱讀 433·2019-08-26 11:58
閱讀 2481·2019-08-26 11:38
閱讀 2439·2019-08-23 18:35
閱讀 3635·2019-08-23 18:33