喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 18  1/2  1  2  > 
     
标题: [原创] 购物车类的设计  
  本主题被作者加入到他/她的 Blog 中  
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
购物车类的设计

购物车类是商城程序一个非常重要的类。写类,就要继承其可以重复利用的思想,高效,扩展性好的特点。
首先,我们要明白要实现怎么样的功能。然后根据功能的需求用代码实现。商城程序的购物车的基本功能有:
        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
  * 邮    箱: [email]qh8.net@163.com[/email]
  * 主    页: [url]http://qh8.net[/url]
 */
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) == ) 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;
    }
}
?>
由此可见,我的设计方法是:分析=>由类执行过程=>类代码实现=>完成
呵呵,想不到写一篇贴子,用了3个小时……




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-9-10 03:49 AM#1
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 为什么我的IF语句没起作用呢?
帮顶下.呵呵.




2006-9-10 09:46 AM#2
查看资料  访问主页  Blog  发短消息  顶部
 
h058 (h058)
新手上路
Rank: 1
初级会员



UID 30667
精华 0
积分 33
帖子 37
金钱 33 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2004-8-24
状态 离线
[推荐阅读] 怎样把连续空格变成一个空格?
清晖?以前在512j上碰到的?原来你到这边混了!呵呵~
2006-9-10 01:40 PM#3
查看资料  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 怎样通过HTTP请求发送cookie?


QUOTE:
原帖由 h058 于 2006-9-10 13:40 发表
清晖?以前在512j上碰到的?原来你到这边混了!呵呵~
是的呀,想不到有人会记得我,感动中,感觉还是中文妮称让人印象深刻…




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-9-11 03:12 PM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
h058 (h058)
新手上路
Rank: 1
初级会员



UID 30667
精华 0
积分 33
帖子 37
金钱 33 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2004-8-24
状态 离线
[推荐阅读] 谁有开源的CMS,我们可以交换
^_^转眼两年过去了!
2006-9-11 07:23 PM#5
查看资料  发短消息  顶部
 
redblade (redblade)
注册会员
Rank: 2
中级会员


UID 29695
精华 0
积分 117
帖子 125
金钱 117 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-6-28
状态 离线
[推荐阅读] id取值问题
我一直都在找这样子购物车的程序教程,唉
终于找到一个这么好的!
谢谢!!!
2006-9-12 04:18 PM#6
查看资料  发短消息  顶部
 
Matrix@Two_Max (深海)
金牌会员
Rank: 6Rank: 6
时尚MAX



UID 27890
精华 0
积分 1189
帖子 1189
金钱 1189 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2004-4-17
状态 离线
[推荐阅读] [广州][招聘][B2B开发][PHP程序员]
在PHP部分版本或状态设置下,

以Session存储购物车未必是可行的。:)

可能需要更特殊的方法,以应付更复杂的环境。

但总体上,这种形式的购物车已能完成很大程度上的应用了:)

顶楼主一下。
2006-9-12 08:12 PM#7
查看资料  访问主页  发短消息  顶部
 
php5
金牌会员
Rank: 6Rank: 6
中级会员


UID 62897
精华 0
积分 1239
帖子 1091
金钱 1239 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2005-1-3
来自 福建
状态 离线
[推荐阅读] 给大家一个好玩的东西
大多数情况下,是看的人多,真正用到购物车的人少

所以,SESSION 里面只要存个物品ID既可

显示时再查表,可能更能节省资源,也会安全一些
2006-9-13 05:33 PM#8
查看资料  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 现在都用什么模板呀


QUOTE:
原帖由 php5 于 2006-9-13 17:33 发表
大多数情况下,是看的人多,真正用到购物车的人少

所以,SESSION 里面只要存个物品ID既可

显示时再查表,可能更能节省资源,也会安全一些
看的人用不到购物车,购物的人才会用得到购物车。即时取商品资料是让顾客可以即时看到购物车里的状态。当然,如果不显示购物车即时状态,节省点资源,也可以改一下这个类使其更实用。




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-9-14 12:49 PM#9
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
LuckLrj (中国php中的爱因斯坦)
版主
Rank: 7Rank: 7Rank: 7
老会员


UID 64836
精华 0
积分 2286
帖子 3075
金钱 2286 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2005-6-19
状态 离线
[推荐阅读] 请问两个表从高到底排序的SQL语句怎么写呀?
我都存cookie里,显示的时候再查表,这样不管用户怎么选择,添加,删除商品,前端js操作cookie,
最后提交的时候才向服务器发送商品列表,这样前端,后端分开,很好维护。




学习,工作累了,请访问我的小站,娱乐一下。http://www.52sunny.net
2006-9-14 02:46 PM#10
查看资料  Blog  发短消息  顶部
 18  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.041734 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP