電商專案核心元件之一是購物車。本類別完整封裝商品增刪改查、價格計算、折扣處理、數量限制,資料儲存在 Session 中,支援多頁面跨請求持久化。
| 屬性 | 說明 |
|---|---|
| $SortCount | 商品種類數 |
| $TotalCost | 總金額 |
| $Id, $Name, $Price | 商品 ID、名稱、原價陣列 |
| $Discount | 折扣百分比(0 表特價) |
| $GoodPrice | 特價金額 |
| $Count | 購買數量 |
| $MaxCount | 限購數量 |
<?php
class TCart {
// 建構子:啟動 Session、註冊變數、載入資料
function TCart() {
$this->SortCount = 0;
session_start();
session_register('sId'); session_register('sName'); session_register('sPrice');
session_register('sDiscount'); session_register('sGoodPrice');
session_register('sCount'); session_register('sMaxCount');
$this->Update();
$this->Calculate();
}
// 從 Session 同步資料到屬性
function Update() {
global $sId, $sName, $sPrice, $sCount, $sDiscount, $sMaxCount, $sGoodPrice;
if (!isset($sId)) return;
$this->Id = $sId; $this->Name = $sName; $this->Price = $sPrice;
$this->Count = $sCount; $this->Discount = $sDiscount;
$this->GoodPrice = $sGoodPrice; $this->MaxCount = $sMaxCount;
$this->SortCount = count($sId);
}
// 計算總金額(支援折扣與特價)
function Calculate() {
$this->TotalCost = 0;
for ($i=0; $i<$this->SortCount; $i++) {
$unitPrice = ($this->Discount[$i] == 0) ? $this->GoodPrice[$i]
: ceil($this->Price[$i] * $this->Discount[$i] / 100);
$this->TotalCost += $unitPrice * $this->Count[$i];
}
}
// 加入商品(已存在則累加數量)
function Add($id, $name, $price, $discount, $goodPrice, $maxCount, $count) {
global $sId, $sName, $sPrice, $sCount, $sDiscount, $sGoodPrice, $sMaxCount;
$found = false;
foreach ($sId as $i => $v) {
if ($v == $id) { $sCount[$i] += $count; $found = true; break; }
}
if (!$found) {
$sId[] = $id; $sName[] = $name; $sPrice[] = $price;
$sCount[] = $count; $sDiscount[] = $discount;
$sGoodPrice[] = $goodPrice; $sMaxCount[] = $maxCount;
}
$this->Update(); $this->Calculate();
}
// 移除商品
function Remove($id) {
global $sId, $sCount;
foreach ($sId as $i => $v) {
if ($v == $id) { $sCount[$i] = 0; break; }
}
$this->Update(); $this->Calculate();
}
// 修改數量
function ModifyCount($index, $count) {
global $sCount;
$sCount[$index] = $count;
$this->Update(); $this->Calculate();
}
// 清空購物車
function RemoveAll() {
session_unregister('sId'); session_unregister('sName'); session_unregister('sPrice');
session_unregister('sDiscount'); session_unregister('sGoodPrice');
session_unregister('sCount'); session_unregister('sMaxCount');
$this->SortCount = 0; $this->TotalCost = 0;
}
// 取得單一商品資訊(陣列)
function Item($i) {
return [
'id' => $this->Id[$i], 'name' => $this->Name[$i],
'price' => $this->Price[$i], 'count' => $this->Count[$i],
'discount' => $this->Discount[$i], 'goodprice' => $this->GoodPrice[$i],
'maxcount' => $this->MaxCount[$i]
];
}
// 取得商品種類數
function CartCount() { return $this->SortCount; }
// 取得總金額
function GetTotalCost() { return $this->TotalCost; }
}
?>
<?php
require_once 'cart.inc.php';
$cart = new TCart();
// 加入商品
$cart->Add(101, 'PHP 書籍', 300, 90, 0, 10, 2); // 9 折
$cart->Add(102, 'Python 書籍', 250, 0, 200, 5, 1); // 特價 200
// 顯示購物車
for ($i=0; $i<$cart->CartCount(); $i++) {
$item = $cart->Item($i);
echo "{$item['name']} x {$item['count']} = " .
($item['discount']==0 ? $item['goodprice'] : ceil($item['price']*$item['discount']/100)) * $item['count'] . "<br>";
}
echo "總計:{$cart->GetTotalCost()}";
?>
session_register,直接操作 $_SESSION['cart'] 陣列jsonSerialize 介面,方便 API 回傳