PHP常用工具类之简单购物车类

对于购物商城网站来说,如果网站没有购物车,那么对商城老板来说这网站将会毫无意义!

当然每次搬砖之前的先分析砖的特点,因为这样搬起砖来又快,又省力,又不赚钱,但是掉头发会慢点!( ⊙ o ⊙ )!

商城购物车有如下特点:

1.在整站范围内有效,且购物车实例只能有一个(单例模式)

2.保持数据的持久性

 ①放在session

②放在数据库里

③放在cookie里

现在为了保持持久性,基本都把数据存在数据库中,因为其他形式保存数据不够稳定

那么作为范例,这次就把它放在session里。至于购物车的基本功能将会在代码中注释!

//session+单例模式
/**
 * 功能分析:
 * 添加商品,
 * 删除
 * 修改
 * 查询商品种类,数量,总金额,返回所有商品
 * 清空购物车
 */
session_start();

class GoodsCarTool{
    private static $ins = null;
    private $items = array();
 
    //防止重写构造和克隆方法
    final protected function __construct(){
      
    }

    final protected  function __clone(){

    }

    //获取实例
    protected static function getIns(){
        if(!(self::$ins instanceof self)){
            self::$ins = new self();
        }
        return self::$ins;
    }

    //把购物车的单例对象放到session里
    public static function getCar(){
        if(!isset($_SESSION['car']) || !($_SESSION['car'] instanceof self)){
            $_SESSION['car'] = self::getIns();
        }
        return $_SESSION['car'];
    }

    //添加商品
    /**
     *$id    商品主键(货号)
     *$name  商品名
     *$price 商品价格
     * $num   购物数量
     */
    public function addItem($id,$name,$price,$num=1){
        //如果该商品已经存在则直接在原来的数量上加
        if($this->hasItem($id)){
            $this->addNum($id,$num);
            return;
        }
        $item = array();
        $item['name'] = $name;
        $item['price'] = $price;
        $item['num'] = $num ;

        $this->items[$id] = $item;

    }


    /**
     * 判断某商品是否存在
     */
    public function hasItem($id){
        return array_key_exists($id,$this->items);

    }


    /**
     *修改购物车中的商品数量
     *id 商品主键
     *num 某个商品修改后的数量,
     *    即直接把某商品的数量改为num
     */
    public function modNum($id,$num){
        if(!$this->hasItem($id)){
            return false;
        }
        $this->items[$id]['num'] = $num;

    }

    /**
     * 商品数量的添加1
     */
    public function addNum($id,$num=1){
        if($this->hasItem($id)){
            $this->items[$id]['num'] +=$num;
        }
    }

    /**
     * 商品数量的减1
     */
    public function subNum($id,$num=1){
        if($this->hasItem($id)){
            $this->items[$id]['num'] -=$num;
        }

        //如果数量减少到0,则把这个商品从购物车中删除掉
        if($this->items[$id]['num']<1){
            $this->delItem($id);
        }
    }

    /**
     * 删除商品
     */
    public function delItem($id){
        unset($this->items[$id]);

    }

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

    /**
     *查询购物车中商品的个数 
     */
    public function getNum(){
        if($this->getCate() == 0){
            return 0;
        }

        $sum = 0;
        foreach ($this->items as $item) {
            $sum += $item['num'];
        }
        return $sum;
    }

    /**
     * 查询购物车中的商品总金额
     */
    public function getPrice(){
        if($this->getCate() == 0){
            return 0;
        }

        $price = 0.00;
        foreach($this->items as $item){
            $price += $item['num'] * $item['price'];
        }
        return $price;
    }

    /**
     * 返回购物车中的所有商品
     */
    public function allGoods(){
        return $this->items;
    }
    /**
     * 清空购物车
     */
    public function clear(){
        $this->items = array();
    }

}

调用示例:

    $car = GoodsCarTool::getCar();

    $act = isset($_GET['test'])?$_GET['test']:'';

    if($act=='add'){
        $car->addItem(1,'王八',23.4,2);
        echo 'ok';

    }else if($act=='addfz'){
        $car->addItem(2333,'方舟',235878.4,1);
        echo 'ok';

    }else if($act=='cle'){
        $car->clear();
        print_r($car);

    }else if($act=='all'){
        print_r($car->allGoods());
        echo '<br>';
        echo '共',$car->getCate(),'种,',$car->getNum(),'个商品</br>';
        echo '共',$car->getPrice(),'元';
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值