本文实例讲述了php实现仿写CodeIgniter的购物车类。分享给大家供大家参考。具体如下:
这里仿写CodeIgniter的购物车类
购物车基本功能:
1) 将物品加入购物车 2) 从购物车中删除物品 3) 更新购物车物品信息 【+1/-1】 4) 对购物车物品进行统计 1. 总项目 2. 总数量 3. 总金额 5) 对购物单项物品的数量及金额进行统计 6) 清空购物车
cart.php文件如下:
<?php/** * * @author quanshuidingdang */class Cart { //物品id及名称规则,调试信息控制 private $product_id_rule = ".a-z0-9-_"; //小写字母 | 数字 | ._- private $product_name_rule = ".:a-z0-9-_";//小写字母 | 数字 | ._-: private $debug = TRUE; //购物车 private $_cart_contents = array(); /** * 构造函数 * * @param array */ public function __construct() { //是否第一次使用? if(isset($_SESSION["cart_contents"])) { $this->_cart_contents = $_SESSION["cart_contents"]; } else { $this->_cart_contents["cart_total"] = 0; $this->_cart_contents["total_items"] = 0; } if($this->debug === TRUE) { //$this->_log("cart_create_success"); } } /** * 将物品加入购物车 * * @access public * @param array 一维或多维数组,必须包含键值名: id -> 物品ID标识, qty -> 数量(quantity), price -> 单价(price), name -> 物品姓名 * @return bool */ public function insert($items = array()) { //输入物品参数异常 if( ! is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_items_insert"); } return FALSE; } //物品参数处理 $save_cart = FALSE; if(isset($items["id"])) { if($this->_insert($items) === TRUE) { $save_cart = TRUE; } } else { foreach($items as $val) { if(is_array($val) AND isset($val["id"])) { if($this->_insert($val) == TRUE) { $save_cart = TRUE; } } } } //当插入成功后保存数据到session if($save_cart) { $this->_save_cart(); return TRUE; } return FALSE; } /** * 更新购物车物品信息 * * @access public * @param array * @return bool */ public function update($items = array()) { //输入物品参数异常 if( !is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_items_insert"); } return FALSE; } //物品参数处理 $save_cart = FALSE; if(isset($items["rowid"]) AND isset($items["qty"])) { if($this->_update($items) === TRUE) { $save_cart = TRUE; } } else { foreach($items as $val) { if(is_array($val) AND isset($val["rowid"]) AND isset($val["qty"])) { if($this->_update($val) === TRUE) { $save_cart = TRUE; } } } } //当更新成功后保存数据到session if($save_cart) { $this->_save_cart(); return TRUE; } return FALSE; } /** * 获取购物车物品总金额 * * @return int */ public function total() { return $this->_cart_contents["cart_total"]; } /** * 获取购物车物品种类 * * @return int */ public function total_items() { return $this->_cart_contents["total_items"]; } /** * 获取购物车 * * @return array */ public function contents() { return $this->_cart_contents; } /** * 获取购物车物品options * * @param string * @return array */ public function options($rowid = "") { if($this->has_options($rowid)) { return $this->_cart_contents[$rowid]["options"]; } else { return array(); } } /** * 清空购物车 * */ public function destroy() { unset($this->_cart_contents); $this->_cart_contents["cart_total"] = 0; $this->_cart_contents["total_items"] = 0; unset($_SESSION["cart_contents"]); } /** * 判断购物车物品是否有options选项 * * @param string * @return bool */ private function has_options($rowid = "") { if( ! isset($this->_cart_contents[$rowid]["options"]) OR count($this->_cart_contents[$rowid]["options"]) === 0) { return FALSE; } return TRUE; } /** * 插入数据 * * @access private * @param array * @return bool */ private function _insert($items = array()) { //输入物品参数异常 if( ! is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_data_insert"); } return FALSE; } //如果物品参数无效(无id/qty/price/name) if( ! isset($items["id"]) OR ! isset($items["qty"]) OR ! isset($items["price"]) OR ! isset($items["name"])) { if($this->debug === TRUE) { $this->_log("cart_items_data_invalid"); } return FALSE; } //去除物品数量左零及非数字字符 $items["qty"] = trim(preg_replace("/([^0-9])/i", "", $items["qty"])); $items["qty"] = trim(preg_replace("/^([0]+)/i", "", $items["qty"])); //如果物品数量为0,或非数字,则我们对购物车不做任何处理! if( ! is_numeric($items["qty"]) OR $items["qty"] == 0) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_invalid"); } return FALSE; } //物品ID正则判断 if( ! preg_match("/^[".$this->product_id_rule."]+$/i", $items["id"])) { if($this->debug === TRUE) { $this->_log("cart_items_data(id)_invalid"); } return FALSE; } //物品名称正则判断 if( ! preg_match("/^[".$this->product_name_rule."]+$/i", $items["name"])) { if($this->debug === TRUE) { $this->_log("cart_items_data(name)_invalid"); } return FALSE; } //去除物品单价左零及非数字(带小数点)字符 $items["price"] = trim(preg_replace("/([^0-9.])/i", "", $items["price"])); $items["price"] = trim(preg_replace("/^([0]+)/i", "", $items["price"])); //如果物品单价非数字 if( ! is_numeric($items["price"])) { if($this->debug === TRUE) { $this->_log("cart_items_data(price)_invalid"); } return FALSE; } //生成物品的唯一id if(isset($items["options"]) AND count($items["options"]) >0) { $rowid = md5($items["id"].implode("", $items["options"])); } else { $rowid = md5($items["id"]); } //加入物品到购物车 unset($this->_cart_contents[$rowid]); $this->_cart_contents[$rowid]["rowid"] = $rowid; foreach($items as $key => $val) { $this->_cart_contents[$rowid][$key] = $val; } return TRUE; } /** * 更新购物车物品信息(私有) * * @access private * @param array * @return bool */ private function _update($items = array()) { //输入物品参数异常 if( ! isset($items["rowid"]) OR ! isset($items["qty"]) OR ! isset($this->_cart_contents[$items["rowid"]])) { if($this->debug == TRUE) { $this->_log("cart_items_data_invalid"); } return FALSE; } //去除物品数量左零及非数字字符 $items["qty"] = preg_replace("/([^0-9])/i", "", $items["qty"]); $items["qty"] = preg_replace("/^([0]+)/i", "", $items["qty"]); //如果物品数量非数字,对购物车不做任何处理! if( ! is_numeric($items["qty"])) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_invalid"); } return FALSE; } //如果购物车物品数量与需要更新的物品数量一致,则不需要更新 if($this->_cart_contents[$items["rowid"]]["qty"] == $items["qty"]) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_equal"); } return FALSE; } //如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除 //否则修改购物车物品数量等于输入的物品数量 if($items["qty"] == 0) { unset($this->_cart_contents[$items["rowid"]]); } else { $this->_cart_contents[$items["rowid"]]["qty"] = $items["qty"]; } return TRUE; } /** * 保存购物车数据到session * * @access private * @return bool */ private function _save_cart() { //首先清除购物车总物品种类及总金额 unset($this->_cart_contents["total_items"]); unset($this->_cart_contents["cart_total"]); //然后遍历数组统计物品种类及总金额 $total = 0; foreach($this->_cart_contents as $key => $val) { if( ! is_array($val) OR ! isset($val["price"]) OR ! isset($val["qty"])) { continue; } $total += ($val["price"] * $val["qty"]); //每种物品的总金额 $this->_cart_contents[$key]["subtotal"] = ($val["price"] * $val["qty"]); } //设置购物车总物品种类及总金额 $this->_cart_contents["total_items"] = count($this->_cart_contents); $this->_cart_contents["cart_total"] = $total; //如果购物车的元素个数少于等于2,说明购物车为空 if(count($this->_cart_contents) <= 2) { unset($_SESSION["cart_contents"]); return FALSE; } //保存购物车数据到session $_SESSION["cart_contents"] = $this->_cart_contents; return TRUE; } /** * 日志记录 * * @access private * @param string * @return bool */ private function _log($msg) { return @file_put_contents("cart_err.log", $msg, FILE_APPEND); }}/*End of file cart.php*//*Location /htdocs/cart.php*/
cart_demo.php文件如下:
<?phpsession_start();require_once("cart.php");$items = array( 0 => array( "id" => "sp001", "qty" => 20, "price" => "10.50", "name" => "a002", "options" => array( "made" => "china", "company" => "bgi" ) ), 1 => array( "id" => "sp002", "qty" => 1, "price" => "3.50", "name" => "b002" ) );$arr = array( "rowid" => "86dbb7cb58a667558b4bbb1f60330028", "qty" => 21 );$cart = new Cart();$cart->insert($items);//var_dump($cart->contents());$cart->update($arr);var_dump($cart->contents());//$cart->destroy();//var_dump($_SESSION["cart_contents"]);/*end of php*/
希望本文所述对大家的php程序设计有所帮助。