1. 程式人生 > >購物車類2分析session+single

購物車類2分析session+single

全部 nbsp ems struct getc 修改 開啟 prot arm

<?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); }

購物車類2分析session+single