购物车类是商城程序一个非常重要的类。写类,就要继承其可以重复利用的思想,高效,扩展性好的特点。
首先,我们要明白要实现怎么样的功能。然后根据功能的需求用代码实现。商城程序的购物车的基本功能有:
1、添加商品
2、移除商品
3、计算总额
不是吧!这么简单?呵呵,购物车流程的确如此。现在就用代码来实现这个过程。
一个商品的固定基本资料有:
1、商品唯一ID号(id)
2、商品名称(name)
3、零售价(retail_price)
4、销售价(price)
变动的资料有:
1、商品数量(quantity)
2、折扣额(discount)
3、小计(subtotal)
全部商品统计的资料有:
1、总数量
2、总金额
3、总折扣(告诉顾客共节省**元)
由于html是无状态语言。对于保存购物车的状态数据可以用SESSION、COOKIE、数据库、文本文件。通常只选一种方式保存,但是每一种保存方式都各有优点。为了使程序更通用、更实用,把存储状态的操作不写入购物车类中,就同时兼容上面几种方法!用数组来实现。
$abc[唯一ID][商品名称]
$abc[唯一ID][零售价]
$abc[唯一ID][销售价]
$abc[唯一ID][数量]
$abc[唯一ID][折扣]
$abc[唯一ID][小计]
如:
Array
(
[1] => Array
(
[name] => 商品名称
[retail_price] => 60
[price] => 50
[quantity] => 4
[discount] => 40
[subtotal] => 200
)
}
下面以session方式实例来说明一下,所需用到类的设计的结果。
session_start();//初始化session
$cat = new x_cart(&$_SESSION['merchandise']);//以引用方式保存购物车状态的变量,也可以用COOKIE或普通变量存数据库或文本文件。
$cat->add_item(array(123,'风扇',60,50),2) ;//添加一个商品与数量。第一个参数是数组,数组依次是id、商品名、零售价、销售价(可选,如果没有给出销售价则销售价就是零售价),第二个参数是商品数量
$cat->add_item(126,1);//同样的一个添加商品函数。有多种输入方式,增加程序操作的灵活性。第一个参数是商品id(可根据此ID自动调用商品名、零售价、销售价),第二个参数是数量
$cat->remove_item(123,1) ;//减商品数量。第一个参数是商品id,第二个是减数量。如果id资料不存在。则返回失败。如果减数量刚好是购物车中数量,则删除此商品。
$cat->dele_item(124);//移除商品ID的全部数量
$cat->edit_item(126,2);//编辑购物车中商品的数量
print_r($cat->sum_item());//返回购物车的总数量、总折扣、总金额
echo '<pre>';
print_r($_SESSION['merchandise']);
$cat->empty_cart();//清空购物车
由此可见,每个方法在类中是如何工作的。根据需要写相对应的代码。下面就带注释详细代码
[php]
//<meta charset=UTF-8">
/*
 * 类 名: cart
 * 功 能: 购物车类
 * 版 本: 1
 * 日 期: 2006年09月07日
* 修改次数: 0
* 最后修改: 2006年09月09日
 * 作 者: qh663
 * 版 权: 清晖
* oicq号码: 80031807
* 邮 箱: binderyi@163.com
* 主 页: http://www.gaoxiaotu5.com
 */
class cart
{
var $items;
var $total;

/**
*构造函数
*/
function cart($varname){
$this->items = &$varname;//引用,绑定变量变化
}
/**
*添加商品基本资料(类内部操作,私有)
*如果$item是数组型,并且有3或4个数量,则赋值。如果是数字型,则预留get_merchandise函数方法取得内容。
*否则就是程序设计的严重失败。(如非设计错误,而是由用户私改变量,可以考虑禁用此操作的用户)
*/
function add_merchandise($item) {
if (is_array($item) and (count($item) == 4 ) or count($item) == 3){
$id = (int)current($item);
if($this->is_item($id) == false){
$this->items[$id]['name'] = (string)next($item);
$this->items[$id]['retail_price'] = next($item);
$price = next($item);
$this->items[$id]['price'] = empty($price)?$this->items[$id]['retail_price']price;
}
return $id;
} elseif (is_numeric($item)){
if($this->is_item($item)){
return $item;
} else {
if ($item = $this->get_merchandise($item)){
return $this->add_merchandise($item);
} else {
die('无此商品');//如非设计错误,用户可能私改变量,可以考虑禁用此操作的用户
}
}
} else {
die('商品参数不正确!');//如非设计错误,用户可能私改变量,可以考虑禁用此操作的用户
}
}
/**
*添加一个商品
*$item 数字或数组(依次是id、商品名、零售价、销售价<可选>)
*$num 数量
*/
function add_item($item, $num) {
$id = $this->add_merchandise($item);
$this->items[$id]['quantity'] += $num;
$this->items[$id]['discount'] = ($this->items[$id]['retail_price'] - $this->items[$id]['price']) * $this->items[$id]['quantity'];//更新折扣
$this->items[$id]['subtotal'] = $this->items[$id]['quantity'] * $this->items[$id]['price'];//更新小计
return true;
}
/**
*减商品
*/
function remove_item($id, $num) {
if ($this->is_item($id) == false) return false;//检测是否在购物车中的物品
if ($this->items[$id]['quantity'] > $num) {//如果购物车中的物品大于要减的数量
$this->items[$id]['quantity'] -= $num;//从购物车中减出
$this->items[$id]['discount'] = ($this->items[$id]['retail_price'] - $this->items[$id]['price']) * $this->items[$id]['quantity'];//更新折扣
$this->items[$id]['subtotal'] = $this->items[$id]['quantity'] * $this->items[$id]['price'];//更新小计
return true;
} elseif ($this->items[$id]['quantity'] == $num) {//如果购物车中的物品等于要减的数量
unset($this->items[$id]);//删除购物车中该物品的所有资料
return true;
} else {
return false;
}
}
/**
*编辑商品数量
*/
function edit_item($id, $num) {
if ($this->is_item($id) == false) return false;//检测是否在购物车中的物品
if ($num > 0) {//保存0件以上的商品放在购物车里
$this->items[$id]['quantity'] = $num;
$this->items[$id]['discount'] = ($this->items[$id]['retail_price'] - $this->items[$id]['price']) * $this->items[$id]['quantity'];//更新折扣
$this->items[$id]['subtotal'] = $this->items[$id]['quantity'] * $this->items[$id]['price'];//更新小计
return true;
} elseif ($num == 0) {//如果是0件
unset($this->items[$id]);//删除购物车中该物品的所有资料
return true;
} else {
return false;
}
}

/**
*删除购物车中该物品的所有资料
*/
function dele_item($id) {
if ($this->is_item($id) == false) return false;
unset($this->items[$id]);
return true;
}

/**
*检测购物车中该物品是否存在
*/
function is_item($id) {
return is_array($this->items[$id]);
}

/**
*清空购物车
*/
function empty_cart(){
$this->items = NULL;
}

/**
*预留方法接口,根据ID取得商品信息源
*/
function get_merchandise($id){
return false;
}
/**
*统计购物车
*/
function sum_item(){
if (!is_array($this->items)) return false;
foreach ($this->items as $value){
$total['quantity'] += $value['quantity'];//总数量
$total['discount'] += $value['discount'];//总折扣
$total['monny'] += $value['subtotal'];//总金额
}
$this->total = $total;
return $total;
}

}

class x_cart extends cart {
/**
*利用预留方法
*/
function get_merchandise($id){
$abc = array($id,'扩展',5.6,3.5);//此为测试数据,请用数据库操作取得相对应数组。
return $abc;
}
}
[/php]
由此可见,我的设计方法是:分析=>由类执行过程=>类代码实现=>完成

发一个正在使用的购物车类的设计相关推荐

  1. 一个比较完善的购物车类

    一个比较完善的购物车类 发布:smiling 来源: 添加日期:2013-12-08 19:06:58 浏览:143 评论:0 前不久做到一个项目需要用到购物车,考虑到可能经常用到,所以把它封装成一个 ...

  2. php 中 相关文章 的思路,php之购物车类思路及代码

    相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...

  3. CodeIgniter 的购物车类只能添加10个商品的解决办法

    刚学用CodeIgniter不久,用了它的一个购物车类,做完了才发现只能添加10个商品到购物车,查了一下资料,原来是商品的把4K的COOKIES占满了.看到Cart类中有一个_save_cart方法, ...

  4. CSS一个元素同时使用多个类选择器(class selector)

    CSS类选择器参考手册 一个元素同时使用多个类选择器 CSS中类选择器用点号表示.实际项目中一个div元素为了能被多个样式表匹配到(样式复用),通常div的class中由好几段组成,如<div ...

  5. java购物车后台_JavaWeb后台购物车类实现代码详解

    相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...

  6. java程序 购物车_用java代码写一个简单的网上购物车程序

    1 需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法.2 3 3.写一个购物车类,有添加商品方法.查看订单信息,删 ...

  7. java语言写购物车_JavaWeb后台购物车类实现代码详解

    相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...

  8. php购物车完整类代码,PHP购物车类代码

    PHP购物车类代码 在开发网络购物网站的时候,购物车类是购物网站的必备模块.总结一个php实现购物车类.实现了购物车中的商品的添加,修改,删除,列表,以及各种计算的相关功能.采用了php单一类的原理, ...

  9. python发朋友圈_10分钟教你用Python发一个高逼格的朋友圈

    程序猿声 你与千万程序猿在一起 01 前言 Hello~各位小伙伴们大家好.现在大家是越来越离不开手机,离不开微信了.每天打开手机的第一或者第二件事就是赶紧打开朋友圈看看有什么好玩的东西.偶尔忍不住了 ...

最新文章

  1. M.2 固态硬盘的两种类型:SATA 和 NVMe 的区别?
  2. 强烈推荐:大神总结的超系统的前端提升路径
  3. Oralce 日期操作
  4. Hive SemanticException
  5. pycharm python3.5 神奇的导入问题
  6. 计算机二级的注册证件号码,如何在Excel中输入以0开头的证件号码
  7. Spring与Struts2的整合
  8. scala 正则表达式
  9. IIS出现问题报CS0016
  10. signature=cc8d613f503e9b933c233da06afc0fc6,襄阳市公安局交通警察支队违法车辆信息公告20210118...
  11. 记一次企业邮官网SEO优化
  12. Activity七大生命周期详解
  13. Android 开发基于Webview 自制一个简单的手机浏览器
  14. 苹果/安卓直播短视频APP系统源码
  15. (转)纵观国内外证券公司IT发展史
  16. Android9.0支持exFat格式u盘识别
  17. 手游逆向专题<英雄联盟手游>: Unity内还原亚索渲染效果
  18. vue 通过日期筛选数据
  19. Python简单删除目录下文件以及文件夹
  20. 针对日语二级的学习方法

热门文章

  1. 手机腾讯云计算机广告怎么关,手机PC全中招!Intel CPU漏洞闹大:腾讯云紧急升级...
  2. 图神经网络入门课程推荐
  3. VS2019 MFC字体模糊
  4. 用360流氓软件都删除不了的超级流氓软件
  5. 3M公司今年第三季度医疗产品事业部销售额增长25.5%
  6. [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  7. 干货 | 电路中为何需要串联小电阻?
  8. C语言实现基于easyx的(低配版)黄金矿工游戏
  9. 都“全民阅读”了你还不装X
  10. HackTheBox Soccer 通过WebSockets进行SQL注入,Doas与Dstat插件提权