一个购物车类(session实现的且为单例模式)

<?php
defined("Hello")||exit("Hello deny!");
/*
购物车类  session 加单例模式
功能分析
添加商品
删除商品
修改商品数量
检查商品是否存在
某商品数量加一
某商品数量减一
查询购物车的商品种类
查询购物车商品数量
是
查询总金额
返回所有商品
添加订单
修改商品库存
清空购物车
*/
//defined("Hello")||exit("Hello deny!");
class CartTool{
    private static $ins = null;
    private $items = array();
    protected function __construct(){
    }
    //获取实例
    private static function getIns(){
        if(!(self::$ins instanceof self)){
            self::$ins = new self();
            return self::$ins;
        }
    }
    //把购物车中的单例对象放到session当中
    public static function getCart(){
        //先判断购物车当中是否存在该单例 否走创建单例并且存放在购物车当中 并且返回 否则直接返回购物车
        if(!isset($_SESSION['cart'])||!($_SESSION['cart'] instanceof self)){
            $_SESSION['cart'] = self::getIns();
            return $_SESSION['cart'];
        }else{
            return $_SESSION['cart'];
        }
    }
    /*
    
    商品id 、 商品名称 、 商品价格 、 商品数量
    */
    public function addItem($id,$goods_name,$shop_price,$goods_num = 1,$goods_img){
        //判断该商品是否存在
        if($this->hasItem($id)){
            $this->modNum($id,$goods_num);
            return true;
        }else{
            //为什么这里不是直接赋值?
            $this->items[$id] = array(
                "id"=>$id,
                "goods_name"=>$goods_name,
                
                "shop_price"=>$shop_price,
                //这里可以不需要写 在goodsModel当中取出 购物车当中的商品的详细信息
                "goods_num"=>$goods_num,
                "addtime"=>time(),
                "goods_img"=>$goods_img
            );
            return true;
        }
    }
    /*修改购物车 商品id 商品修改后的数量 直接修改*/
    public function modNum($id,$num){
        //先判断购物车当中是否存在该商品 否则修改商品数量
        if(!$this->hasItem($id)){
            return false;
        }else{
            //$this->items[$goods_id]['goods_num'] = $num;
            $this->increaNum($id,$num);
        }
    }
    /*通过点击按钮修改商品数量*/
    public function increaNum($id,$num){
        if($this->hasItem($id)){
            $this->items[$id]['goods_num'] += $num;
        }
    }
    public function decreaNum($id,$num){
        //先判断商品是否存在再进行操作
        if($this->hasItem($id)){
            $this->items[$id]['goods_num'] -= $num;
        }
        //如果商品数量为0则删除该商品
        if($this->items[$id]['goods_num'] <= 0){
            $this->delItem($id);
        }
    }
    /*返回商品种类 即购物车中item的key*/
    public function countItem(){
        return array_keys($this->items);
    }
    /*总的商品个数*/
    public function getSum(){
        $sum = 0;
        foreach ($this->items as $value) {
            $sum+=$value['goods_num'];
        }
        return $sum;
    }
    /*获取商品的总价格*/
    public function getPrice(){
        if($this->countItem() == 0){
            return 0;
        }
        $sum = 0.0;
        foreach ($this->items as $value) {
            $sum+=$value['goods_num']*$value['shop_price'];
        }
        return $sum;
    }
    /*删除商品*/
    public function delItem($id){
        unset($this->items[$id]);
    }
    /*清空购物车*/
    public function clear(){
        $this->items = array();
    }
    public function getAllItem(){
        return $this->items;
    }
    /*判断商品是否存在*/
    public function hasItem($id){
        if($this->countItem() == 0){
            return 0;
        }
        return array_key_exists($id, $this->items);
    }
    /**
     * 获取购物车当中最新添加的几条数据
     * @return [type] [description]
     */
    public function getPre($number){
        $num = $this->getAllItem();
        if(!empty($num)){
            if(count($num)>=$number){
                $vo = array();
                foreach ($num as $key => $value) {
                    $vo[] = $value['addtime'];
                }
                /**
                 * 将数据根据 volume 降序排列,根据 edition 升序排列
                     把 $data 作为最后一个参数,以通用键排序
                    array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
                     
                 */
                $sor  = $num;
                array_multisort($vo,SORT_DESC,$sor);
                return array_slice($sor,0,$number);
            }else{
                return $num;
            }
        }else{
            return false;
        }
    }
}
//测试代码
/*
$car = CartTool::getCart();
$car->addItem(1,"1",12,1);
$car->addItem(2,"1",12,1);
$car->addItem(2,"1",12,2);
$car->clear();
var_dump($car);
///$car->clear();
echo "<hr/>";
var_dump($car);
$car->increaNum(2);
$car->clear();
var_dump($car);
var_dump($car->getAllItem());
*/
//测试代码
/*
$car = CartTool::getCart();
$car->addItem(1,"1",12,1);
$car->addItem(2,"1",12,1);
$car->addItem(2,"1",12,2);
$car->clear();
var_dump($car);
///$car->clear();
echo "<hr/>";
var_dump($car);
$car->increaNum(2);
$car->clear();
var_dump($car);
var_dump($car->getAllItem());
*/
原文地址:https://www.cnblogs.com/webcyh/p/11296473.html