1. 程式人生 > >PHP商城筆記(實戰篇) —— 購物車類

PHP商城筆記(實戰篇) —— 購物車類

/**
====筆記部分====
購物車類

分析構造車:
1:你無論在本網站重新整理了多少次次頁面,或者新增了多少個商品,
都要求你檢視購物車時,看到的都是一個一樣的結果.

即:你開啟A商品重新整理,B商品重新整理,首頁,看到的購物車應該是一樣的.

或者說:整站範圍內,購物車–是全域性有效的!

解決:把購物車的資訊放在資料庫,也可以放在session/cookie裡

2:既然是全域性有效,暗示,購物車的例項只能有1個!
不能說在3個頁面,買了3個商品,就形成了3個購物車例項,這顯然不合理.
解決:單例模式

技術選型: session+單例

功能分析:

判斷某個商品是否存在
新增商品
刪除商品
修改商品的數量

某商品數量加1
某商品數量減1

查詢購物車的商品種類
查詢購物車的商品數量
查詢購物車裡的商品總金額
返回購物車裡的所有商品

清空購物車
**/


CartTool.class.php
購物車類:

defined('ACC')||exit('Acc Deined');

class CartTool {
    private static $ins = null;
    private $items = array();

    final protected function __construct() {
    }

    final protected function
__clone() {
} // 獲取例項 protected static function getIns() { // 如果不是自身的例項就自己建立一個例項 if(!(self::$ins instanceof self)) { self::$ins = new self(); } return self::$ins; } // 把購物車的單例物件放到session裡 public static function getCart() { // 判斷session中有沒有cart
// 再判斷session存在的cart是不是自身的例項 // 如果既不存在也不是自身例項就判斷為不存在我們購物車的例項 if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)) { $_SESSION['cart'] = self::getIns(); } return $_SESSION['cart']; } /* 新增商品 param int $id 商品主鍵 param string $name 商品名稱 param float $price 商品價格 param int $num 購物數量 */ public function addItem($id,$name,$price,$num=1) { if($this->hasItem($id)) { // 如果該商品已經存在,則直接加其數量 $this->incNum($id,$num); return; } $item = array(); $item['name'] = $name; $item['price'] = $price; $item['num'] = $num; $this->items[$id] = $item; } /* 修改購物車中的商品數量 param int $id 商品主鍵 param int $num 某個商品修改後的數量,即直接把某商品的數量改為$num */ public function modNum($id,$num=1) { // 先判斷商品是否存在 if(!$this->hasItem($id)) { return false; } $this->items[$id]['num'] = $num; } /* 商品數量增加1 */ public function incNum($id,$num=1) { if($this->hasItem($id)) { $this->items[$id]['num'] += $num; } } /* 商品數量減少1 */ public function decNum($id,$num=1) { if($this->hasItem($id)) { $this->items[$id]['num'] -= $num; } // 如果減少後,數量為0了,則把這個商品從購物車刪掉 if($this->items[$id]['num'] < 1) { $this->delItem($id); } } /* 判斷某商品是否存在 */ public function hasItem($id) { return array_key_exists($id,$this->items); } /* 刪除商品 */ public function delItem($id) { unset($this->items[$id]); } /* 查詢購物車中商品的種類 */ public function getCnt() { return count($this->items); } /* 查詢購物車中商品的個數 */ public function getNum() { // 先看有沒這種商品 if($this->getCnt() == 0) { return 0; } $sum = 0; // 迴圈把這個陣列內容加一遍 foreach($this->items as $item) { $sum += $item['num']; } return $sum; } /* 查詢購物車中商品的總金額 */ public function getPrice() { if($this->getCnt() == 0) { return 0; } $price = 0.0; // 迴圈把這個陣列的(數量和單價相乘)加一遍 foreach($this->items as $item) { $price += $item['num'] * $item['price']; } return $price; } /* 返回購物車中的所有商品 */ public function all() { return $this->items; } /* 清空購物車 */ public function clear() { $this->items = array(); } }

各個功能的測試:

session_start();

// print_r(CartTool::getCart());

$cart = CartTool::getCart();

if(!isset($_GET['test'])) {
   $_GET['test'] = '';
}

if($_GET['test'] == 'addwangba') {
    $cart->addItem(1,'王八',23.4,1);
    echo 'add wangba ok';
} else if($_GET['test'] == 'addfz') {
    $cart->addItem(2,'方舟',2347.56,1);
    echo 'add fangzhou ok';
} else if($_GET['test'] == 'clear') {
    $cart->clear();
} else if($_GET['test'] == 'show') {
    print_r($cart->all());
    echo '<br />';
    echo '共',$cart->getCnt(),'種',$cart->getNum(),'個商品<br />';
    echo '共',$cart->getPrice(),'元';
} else {
    print_r($cart);
}