PHP商城筆記(實戰篇) —— 購物車類
阿新 • • 發佈:2019-02-09
/**
====筆記部分====
購物車類
分析構造車:
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);
}