购物车类2分析session+single

<?php
/**
 * 购物车类分析
 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品。打开购物车查看,看到的结果都市一样的
 *         即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的
 *         整站范围内购物车是全局有效有的。
 *     解决:将购物车的信息放在数据库,也可以放在session里。
 * 2.购物车全局有效,即购物车的实例只能有一个
 *         不能出现3个页面,,买3个商品,就形成了3个购物车实例
 *     解决:单例模式
 *
 * 技术支持:seesion+single
 *
 * 功能分析:
 * 判断某个商品是否存在
 * 添加商品
 * 删除商品
 * 修改商品的数量
 *
 * 某商品数量+1
 * 某商品数量-1
 *
 * 查询购物车的商品种类
 * 查询购物车的商品数量
 * 查询购物车的商品总金额
 * 返回购物车里的所有商品
 * 清空购物车
 */
error_reporting(‘E^ALL‘);
session_start();//使用session必须开启session

class CartTool{
    //此处要要到单例模式
    private static $ins = null;
    private $items = array();//用空数组存储商品

    //为防止他人重写,此时使用final构造方法受保护,
    final protected function __construct(){

    }
    //防止被克隆,
    final protected function __clone(){}

    //获取实例。开发一个方法供外部调用
    protected static function getIns(){
        //判断$ins是否是自身的实例
        // if(!(self::$ins instanceof self)){
        if(self::$ins === null){//若属性为null则是第一次访问
            self::$ins = new self();
        }
        return self::$ins;
    }

    //将购物车的单例对象放到session里面
    public static function getCart(){//只需此处让外部实例化购物车,其他全部受保护啊
        //sessoin里面没有购物车,或者不是session里面的实例
        if(!isset($_SESSION[‘cart‘]) || !($_SESSION[‘cart‘] instanceof self)){
            $_SESSION[‘cart‘] = self::getIns();
        }
        return $_SESSION[‘cart‘];
    }
    /**
     * 添加商品,必须有商品id,名称,价格,数量
     * @parm int $goods_id商品主键
     * 因为主键不可能重复,此时用$goods_id作为数组的索引,下标
     */
    public function addItem($goods_id,$goods_name,$shop_price,$num=1){
        //判断添加的商品在购物车中是否已经存在
        if($this->hasItem($goods_id)){
            return $this->incNum($goods_id , $num);
        }
        $this->items[$goods_id] = array();//此时items为二维数组
        $this->items[$goods_id][‘goods_name‘] = $goods_name;
        $this->items[$goods_id][‘shop_price‘] = $shop_price;
        $this->items[$goods_id][‘num‘] = $num;
    }

    /**
     * 修改购物车中的商品啊数量
     * @param int $num,某个商品修改后的数量,即直接把某商品的数量改成$num
     */
    public function modNum($goods_id , $num=1){
        if( !$this->hasItem($goods_id) ){
            $this->items[$goods_id][‘num‘] = $num;
        }else{
            return false;
        }
    }

    /**
     * 购物车中数量增加一个
     */
    public function incNum($goods_id , $num=1){
        if($this->hasItem($goods_id)){
            $this->items[$goods_id][‘num‘]+=$num;
        }
    }

    /**
     * 购物车中数量减一
     * 若商品减少为0了,则把商品从购物车删除
     */
    public function decNum($goods_id , $num=1){
        if($this->hasItem($goods_id)){
            $this->items[$goods_id][‘num‘]-=$num;
        }
        //若减少到数量为0,则把该商品从购物车删除
        if($this->items[$goods_id][‘num‘]<1){
            $this->delItem($goods_id);
        }
    }

    /**
     * 判断某商品是否存在
     * 给到一个goods_id,直接判断该id下的商品是否存在
     */
    public function hasItem($goods_id){
        return array_key_exists($goods_id , $this->items);//判断键是否存在
    }

    /**
     * 删除商品
     * 直接unset掉
     */
    public function delItem($goods_id){
        unset($this->items[$goods_id]);
    }

    /**
     * 查询购物车中商品的种类
     */
    public function getCnt(){
        return count($this->items);
    }

    /**
     * 查询购物车中商品的个数
     */
    public function getNum(){
        if($this->getCnt() == 0){
            return 0;
        }
        $sum = 0;
        foreach($this->items as $v){
            $sum += $v[‘num‘];
        }
        return $sum;
    }

    /**
     *查询购物车中商品的总金额
     */
    public function getPrice(){
        if($this->getCnt() == 0){
            return 0;
        }
        $price = 0.0;
        foreach($this->items as $v){
            $price += $v[‘num‘] * $v[‘shop_price‘];
        }
        return $price;
    }

    /**
     * 返回购物车中的所有商品
     */
    public function  all(){
        return $this->items;
    }

    /**
     * 清空购物车
     * 直接赋值为空,即可清空购物车
     */
    public function clear(){
        $this->items=array();
    }
}

$cart = CartTool::getCart();//获取购物车
if($_GET[‘test‘] == ‘add‘){
    $cart->addItem(1 , ‘面包‘ , 15 , 1);
    echo  ‘ok‘;
}else if($_GET[‘test‘] == ‘show‘){
    print_r($cart->all());
    echo ‘<br/>‘;
    echo ‘共‘,$cart->getCnt(),‘种‘,$cart->getNum(),‘个商品<br/>‘;
    echo ‘共‘,$cart->getPrice(),‘元‘;
}else if($_GET[‘test‘] == ‘clear‘){
    print_r($cart->clear());
}else{
    print_r($cart);
}
时间: 2024-10-10 06:33:00

购物车类2分析session+single的相关文章

购物车类分析session+single

<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品.打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的. * 解决:将购物车的信息放在数据库,也可以放在session里. * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析

MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾名思义就是Map输出结果的一个Buffer,用户在编写map方法的时候有一个参数OutputCollector: void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter) throws IOExcep

PHP购物车类

<?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = array(); protected function __construct(){} // 获取实例 protected static function getIns(){ if(!(self::$ins instanceof self)){ self::$ins = new self(); } return

php之购物车类思路及代码

<?php /* 购物车类 1.整站范围内,购物车--全局有效 解决:把购物车的信息,放在session里 2.既然全局有效,购物车的实例只有一个 解决:单例模式 技术选型:session+单例 功能分析 判断商品是否存在 添加商品 删除商品 修改商品的数量 某商品数量+1 某商品数量-1 查看购物车的商品种类 商品数量 商品的总金额 所有商品 清空购物车 */ session_start(); class CartTool { private static $ins = null; priva

Tomcat7.0源码分析——Session管理分析(上)

前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对于使用Tomcat作为Web容器的大部分开发人员而言,Tomcat是如何实现Session标记用户和管理Session信息的呢? 概述 Session Tomcat内部定义了Session和HttpSession这两个会话相关的接口,其类继承体系如图1所示. 图1 Session类继承体系图1中额外

CVE-2013-3897漏洞成因与利用分析(UAF类漏洞分析流程)

CVE-2013-3897漏洞成因与利用分析(UAF类漏洞分析流程) 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存.攻击者可以利用此类漏洞实现远程代码执行.UAF漏洞的根源源于对对象引用计数的处理不当,比如在编写程序时忘记AddRef或者多加了Release,最终导致对象的释放.对于IE的大部分对象(COM编程实现)来说,+4偏移处的含义是该对象的引用计数,可以通过跟踪它来定位补丁前后的位置及被释放的位置.+0偏移处的含义是该对象的虚函数表指针,可以通

String类原理分析及部分方法

//String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html //String类包含在java.lang包中,这个包在java的时候就自动import //String类是唯一一个不需要new关键词来创建对象的类. public class Test{ public

《3D数学基础》实践1 向量类代码分析

理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. 本套视频完全免费,欢迎捐助,帮助我完成这套视频 支付宝帐号:[email protected]gmail.com 今天带来的是系列第11讲--实践1 向量类代码分析 本次视频,主要讲解一下如下几个库中的向量类的代码: 1.3D Math Primer for Games and Graphics Develo

java同步包种ArrayBlockingQueue类的分析与理解

前言: ArrayBlockingQueue类是一个阻塞队列,重要用于多线程操作的条件. 一,官方解释 一个建立在数组之上被BlockingQueue绑定的阻塞队列.这个队列元素顺序是先进先出.队列的头部是在队列中待的时间最长的元素.队列的尾部是再队列中待的时间最短的元素.新的元素会被插入到队列尾部,并且队列从队列头部获取元素. 这是一个典型的绑定缓冲,在这个缓冲区中,有一个固定大小的数组持有生产者插入的数据,并且消费者会提取这些数据.一旦这个类被创建,那么这个数组的容量将不能再被改变.尝试使用