PHP实现商城购物车类(SESSION+单例模式 )(亲测)
1 <?php 2 if(!isset($_SESSION)) 3 session_start(); 4 //分析购物车 5 //整站范围内,购物车全局有效 6 //技术 : session购物车 + 单例模式 7 //增删商品,判断商品是否存在 8 //查询商品种类,数量,查询总金额,返回购物车所有商品 9 //某商品数量+1 -1 10 class CartTool{ 11 private static $ins = null; //实例保存 12 private $items = array(); //保存商品 13 //public $sign = 0; 14 //单例 15 protected function __construct(){ 16 // $this->sign = mt_rand(1,10000); 17 18 } 19 //防止外界克隆 20 final protected function __clone(){ 21 } 22 //单例方法,获取实例 23 protected function getIns(){ 24 if(!(self::$ins instanceof self)){ //若不是自身的实例 25 self::$ins = new self(); 26 } 27 return self::$ins; 28 } 29 //把购物车的单例对象放到session里 30 public static function getCart(){ 31 //session中没有购物车,或者session总的实例不是本身的实例 32 if((!(isset($_SESSION[‘cart‘])) || !($_SESSION[‘cart‘] instanceof self))){ 33 $_SESSION[‘cart‘] = self::getIns(); 34 } 35 return $_SESSION[‘cart‘]; 36 } 37 //添加商品 38 //id: goods_id goods_name shop_price number 39 public function addItem($id,$name,$price,$num = 1){ 40 if(($this->hasItem($id))){ //若商品已存在,直接加数量 41 $this->incNum($id,$num); 42 return true; 43 } 44 $item_temp[‘id‘] = $id; 45 $item_temp[‘name‘] = $name; 46 $item_temp[‘price‘] = $price; 47 $item_temp[‘num‘] = $num; 48 $this->items["$id"] = $item_temp; //二维数组 49 } 50 //清空购物车 51 public function clearItem(){ 52 $this->items = array(); 53 } 54 55 //判断某商品是否存在 56 public function hasItem($id){ 57 return array_key_exists($id,$this->items); 58 } 59 //修改购物车中的商品数量 int goods_id $num number 60 public function modNum($id,$num=1){ 61 if(!($this->hasItem($id))){ 62 echo "商品主键不存在,无法修改商品数量"; 63 return false; 64 } 65 $this->items[$id][‘num‘] = $num; 66 } 67 //商品数量加一 68 public function incNum($id){ 69 if(!($this->hasItem($id))){ 70 echo "商品主键不存在,无法增加商品"; 71 return false; 72 } 73 $this->items[$id][‘num‘] += 1; 74 } 75 //商品数量减一 76 public function decNum($id,$num=1){ 77 if(!($this->hasItem($id))){ 78 echo "商品主键不存在,无法减少商品"; 79 return false; 80 } 81 82 $this->items[$id][‘num‘] -= $num; 83 //如果减少后商品数量为0了,则把商品从购物车删除 84 if($this->items[$id][‘num‘] <= 0) 85 $this->delItem($id); 86 } 87 //删除商品 id 88 public function delItem($id){ 89 unset($this->items[$id]); 90 } 91 //查询购物车中商品种类 92 public function getCnt(){ 93 return count($this->items); 94 } 95 //查询购物车总商品的个数 96 public function getNum(){ 97 $temp_num = 0; 98 if($this->getCnt() == 0)//若购物车没有商品,数量自然为0 99 $temp_num = 0; 100 foreach($this->items as $item){ 101 $temp_num += $item[‘num‘]; 102 } 103 return $temp_num; 104 } 105 //查询购物车总商品的总金额 106 public function getPrice(){ 107 $temp_money = 0.0; 108 if($this->getCnt() == 0)//若购物车没有商品,金额自然为0 109 $temp_money = 0.0; 110 foreach($this->items as $item){ 111 $temp_money += ($item[‘num‘] * $item[‘price‘]); 112 } 113 return $temp_money; 114 } 115 //返回购物车所有商品,空:返回商品数组 任意字符串:数组形式返回所有商品的名字 116 public function getAllGoods($fun=‘‘){ 117 if($fun == ‘‘) 118 return $this->items; 119 //返回所有商品的名字 120 $temp_arr = array(); 121 foreach($this->items as $k=>$v){ 122 $temp_arr[] = array( $k=>$v[‘name‘] ); 123 } 124 return $temp_arr; 125 } 126 } 127 /** php 测试 代码 128 $cart = CartTool::getCart(); 129 if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘add‘){ 130 $cart->addItem(‘1‘,"雪",‘88888‘); 131 $cart->addItem(‘5‘,"雪1",‘88888‘); 132 $cart->addItem(‘8‘,"雪2",‘88888‘); 133 echo ‘add ok‘; 134 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘clear‘){ 135 $cart->clearItem(); 136 echo "successufl ok"; 137 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘num‘){ 138 $cart->modNum(8,3); 139 echo "modify ok"; 140 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘add1‘){ 141 $cart->incNum(8); 142 echo "modify ok"; 143 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘dec1‘){ 144 $cart->decNum(8); 145 echo "modify ok"; 146 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘price‘){ 147 echo "总共",$cart->getNum(),"种商品"; 148 $pri = $cart->getPrice(); 149 echo "总共",$pri,‘元‘; 150 }else if(isset($_GET[‘test‘]) && $_GET[‘test‘] == ‘all‘){ 151 152 print_r( $cart->getAllGoods()); 153 echo "<hr/>"; 154 print_r( $cart->getAllGoods(1)); 155 }else{ 156 print_r($cart); 157 } 158 echo "<br/>"; 159 //print_r(CartTool::getCart()); 160 */ 161 ?>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。