<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品。打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的。 * 解决:将购物车的信息放在数据库,也可以放在session里。 * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析: * 判断某个商品是否存在 * 添加商品 * 删除商品 * 修改商品的数量 * * 某商品数量+1 * 某商品数量-1 * * 查询购物车的商品种类 * 查询购物车的商品数量 * 查询购物车的商品总金额 * 返回购物车里的所有商品 * 清空购物车 */ error_reporting(‘E^ALL‘); session_start();//使用session必须开启session class CartTool{ //此处要要到单例模式 private static $ins = null; private $items = array();//用空数组存储商品 //为防止他人重写,此时使用final构造方法受保护, final protected function __construct(){ } //防止被克隆, final protected function __clone(){} //获取实例。开发一个方法供外部调用 protected static function getIns(){ //判断$ins是否是自身的实例 // if(!(self::$ins instanceof self)){ if(self::$ins === null){//若属性为null则是第一次访问 self::$ins = new self(); } return self::$ins; } //将购物车的单例对象放到session里面 public static function getCart(){//只需此处让外部实例化购物车,其他全部受保护啊 //sessoin里面没有购物车,或者不是session里面的实例 if(!isset($_SESSION[‘cart‘]) || !($_SESSION[‘cart‘] instanceof self)){ $_SESSION[‘cart‘] = self::getIns(); } return $_SESSION[‘cart‘]; } /** * 添加商品,必须有商品id,名称,价格,数量 * @parm int $goods_id商品主键 * 因为主键不可能重复,此时用$goods_id作为数组的索引,下标 */ public function addItem($goods_id,$goods_name,$shop_price,$num=1){ //判断添加的商品在购物车中是否已经存在 if($this->hasItem($goods_id)){ return $this->incNum($goods_id , $num); } $this->items[$goods_id] = array();//此时items为二维数组 $this->items[$goods_id][‘goods_name‘] = $goods_name; $this->items[$goods_id][‘shop_price‘] = $shop_price; $this->items[$goods_id][‘num‘] = $num; } /** * 修改购物车中的商品啊数量 * @param int $num,某个商品修改后的数量,即直接把某商品的数量改成$num */ public function modNum($goods_id , $num=1){ if( !$this->hasItem($goods_id) ){ $this->items[$goods_id][‘num‘] = $num; }else{ return false; } } /** * 购物车中数量增加一个 */ public function incNum($goods_id , $num=1){ if($this->hasItem($goods_id)){ $this->items[$goods_id][‘num‘]+=$num; } } /** * 购物车中数量减一 * 若商品减少为0了,则把商品从购物车删除 */ public function decNum($goods_id , $num=1){ if($this->hasItem($goods_id)){ $this->items[$goods_id][‘num‘]-=$num; } //若减少到数量为0,则把该商品从购物车删除 if($this->items[$goods_id][‘num‘]<1){ $this->delItem($goods_id); } } /** * 判断某商品是否存在 * 给到一个goods_id,直接判断该id下的商品是否存在 */ public function hasItem($goods_id){ return array_key_exists($goods_id , $this->items);//判断键是否存在 } /** * 删除商品 * 直接unset掉 */ public function delItem($goods_id){ unset($this->items[$goods_id]); } /** * 查询购物车中商品的种类 */ public function getCnt(){ return count($this->items); } /** * 查询购物车中商品的个数 */ public function getNum(){ if($this->getCnt() == 0){ return 0; } $sum = 0; foreach($this->items as $v){ $sum += $v[‘num‘]; } return $sum; } /** *查询购物车中商品的总金额 */ public function getPrice(){ if($this->getCnt() == 0){ return 0; } $price = 0.0; foreach($this->items as $v){ $price += $v[‘num‘] * $v[‘shop_price‘]; } return $price; } /** * 返回购物车中的所有商品 */ public function all(){ return $this->items; } /** * 清空购物车 * 直接赋值为空,即可清空购物车 */ public function clear(){ $this->items=array(); } } $cart = CartTool::getCart();//获取购物车 if($_GET[‘test‘] == ‘add‘){ $cart->addItem(1 , ‘面包‘ , 15 , 1); echo ‘ok‘; }else if($_GET[‘test‘] == ‘show‘){ print_r($cart->all()); echo ‘<br/>‘; echo ‘共‘,$cart->getCnt(),‘种‘,$cart->getNum(),‘个商品<br/>‘; echo ‘共‘,$cart->getPrice(),‘元‘; }else if($_GET[‘test‘] == ‘clear‘){ print_r($cart->clear()); }else{ print_r($cart); }
时间: 2024-10-10 06:33:00