首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 完善購物車類別實作(Session 儲存)

     編輯:PHP 綜合知識

電商專案核心元件之一是購物車。本類別完整封裝商品增刪改查、價格計算、折扣處理、數量限制,資料儲存在 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 回傳
  • 支援資料庫持久化(登入用戶跨裝置同步)
  • 引入事件機制(加入商品、結帳前)擴展優惠券、庫存檢查等
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved