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 ?>

 

你可能感兴趣的:(session)