单例模式实现购物车

jerry thinkphp 2015年11月19日 收藏
采用单例模式写的购物车
  1. <?php
  2. session_start();
  3. /**
  4. *单例模式购物车(SESSION购物车)
  5. */
  6. class CartTool{
  7. private static $ins = null;
  8. private $items = array();
  9. public $rand = 0;
  10.  
  11. protected function __construct(){
  12. header("Content-type: text/html; charset=utf-8");
  13. $this->rand = mt_rand(1,99999);
  14. }
  15.  
  16. /**
  17. * 防止被复制
  18. */
  19. final protected function __clone(){ }
  20.  
  21. /**
  22. * 获取实例
  23. * */
  24. protected static function getIns(){
  25. //判断该实例是否被实例化
  26. if(!(self::$ins instanceof self)){
  27. self::$ins = new self();
  28. }
  29.  
  30. return self::$ins;
  31. }
  32.  
  33. /**
  34. * 把购物车的单例对象放到session里
  35. * */
  36. public static function getCart(){
  37. //判断购物车是否存在,并且该购物车是否是我的
  38. if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)){
  39.   $_SESSION['cart'] =  self::getIns();
  40. }
  41.  
  42. return $_SESSION['cart'];
  43. }
  44.  
  45. /**
  46. * 添加商品
  47. * @param $id 商品id
  48. * @param $name 商品名称
  49. * @param $price 商品价格
  50. * @param $num 商品数量
  51. */
  52. public function addItem($id,$name,$price,$num=1){
  53. if($this->hasItem($id)){//如果商品存在,则数量相加
  54. $this->incNum($id,$num);
  55. return ;
  56. }
  57.  
  58. $item = array();
  59. $item['name'] = $name;
  60. $item['price'] = $price;
  61. $item['num'] = $num;
  62.  
  63. $this->items[$id] = $item;
  64. }
  65.  
  66. /**
  67. * 修改购物车中的商品数量
  68. * @param $id 商品主键
  69. * @param int $num 某个商品修改后的数量,即直接把某商品的数量改为$num
  70. * @return boolean
  71. */
  72. public function modNum($id,$num=1){
  73. if(!$this->hasItem($id)){
  74. return false;
  75. }
  76.  
  77. $this->items[$id]['num'] = $num;
  78. }
  79.  
  80. /**
  81. * 商品数量增加1
  82. * @param $id int 商品主键
  83. * @param $num int
  84. */
  85. public function incNum($id,$num=1){
  86. if($this->hasItem($id)){
  87. $this->items[$id]['num'] +=$num;
  88. }
  89. }
  90.  
  91. /**
  92. * 商品数量增加1
  93. * @param $id 商品主键
  94. * @param $num
  95. */
  96. public function decNum($id,$num=1){
  97. if($this->hasItem($id)){
  98. $this->items[$id]['num'] -=$num;
  99. }
  100.  
  101. //如果减少后,数量为0了,则把这个商品从购物车删掉
  102. if($this->items[$id]['num']<1){
  103. $this->delItem($id);
  104. }
  105. }
  106.  
  107. /**
  108. *删除商品
  109. * @param $id
  110. */
  111. public function delItem($id){
  112. unset($this->items[$id]);
  113. }
  114.  
  115. /**
  116. * 判断商品是否存在
  117. * @param $id 商品主键
  118. * @return bool
  119. */
  120. public function hasItem($id){
  121. return array_key_exists($id,$this->items);
  122. }
  123.  
  124. /**
  125. * 商品种类
  126. * @return int
  127. */
  128. public function getCnt(){
  129. return count($this->items);
  130. }
  131.  
  132. /**
  133. * 查询购物车中商品的个数
  134. * @return int
  135. */
  136. public function getNum(){
  137. if($this->getCnt()==0){
  138. return 0;
  139. }
  140.  
  141. $sum=0;
  142. foreach($this->items as $item){
  143. $sum +=$item['num'];
  144. }
  145.  
  146. return $sum;
  147. }
  148.  
  149. /**
  150. * 查询购物车中商品的总金额
  151. * @return float|int
  152. */
  153. public function getPrice(){
  154. if($this->getCnt()==0){
  155. return 0;
  156. }
  157.  
  158. $price=0.0;
  159. foreach($this->items as $item){
  160. $price +=$item['num'] * $item['price'];
  161. }
  162.  
  163. return $price;
  164. }
  165.  
  166. /**
  167. * 返回购物车中的所有商品
  168. */
  169. public function getAll(){
  170. return $this->items;
  171. }
  172.  
  173. /**
  174. * 清空购物车
  175. */
  176. public function clear(){
  177. $this->items = array();
  178. }
  179. }
  180.  
  181. //调用方法
  182. $cart = CartTool::getCart();
  183. $cart->addItem(1,'电脑',120,1);
  184. $cart->addItem(2,'手机',500,1);
  185. $cart->addItem(3,'平板',900,1);
  186. print_r($cart->getAll());
  187.  
  188. ?>