zoukankan      html  css  js  c++  java
  • PHP实现商城购物车类(SESSION+单例模式 )(亲测)

      1 <?php
      2 if(!isset($_SESSION))
      3     session_start();
      4 //分析购物车
      5 //整站范围内,购物车全局有效
      6 //技术 : session购物车 + 单例模式
      7 //增删商品,判断商品是否存在
      8 //查询商品种类,数量,查询总金额,返回购物车所有商品
      9 //某商品数量+1  -1
     10 class CartTool{
     11     private static $ins = null;     //实例保存
     12     private $items = array();       //保存商品
     13     //public  $sign = 0;
     14     //单例
     15     protected function __construct(){
     16         //  $this->sign = mt_rand(1,10000);
     17         
     18     }
     19     //防止外界克隆
     20     final protected function __clone(){
     21     }
     22     //单例方法,获取实例
     23     protected function getIns(){
     24         if(!(self::$ins instanceof self)){  //若不是自身的实例
     25             self::$ins = new self();
     26         }
     27         return self::$ins;
     28     }
     29     //把购物车的单例对象放到session里
     30     public static function getCart(){
     31         //session中没有购物车,或者session总的实例不是本身的实例
     32         if((!(isset($_SESSION['cart'])) || !($_SESSION['cart'] instanceof self))){
     33             $_SESSION['cart'] = self::getIns();
     34         }
     35         return $_SESSION['cart'];
     36     }
     37     //添加商品  
     38     //id: goods_id   goods_name  shop_price  number 
     39     public function addItem($id,$name,$price,$num = 1){
     40         if(($this->hasItem($id))){  //若商品已存在,直接加数量
     41             $this->incNum($id,$num);
     42             return true;
     43         }
     44         $item_temp['id'] = $id;
     45         $item_temp['name'] = $name;
     46         $item_temp['price'] = $price;
     47         $item_temp['num'] = $num;
     48         $this->items["$id"] = $item_temp;  //二维数组
     49     }
     50     //清空购物车
     51     public function clearItem(){
     52         $this->items = array();
     53     }
     54     
     55     //判断某商品是否存在
     56     public function hasItem($id){
     57         return array_key_exists($id,$this->items);
     58     }
     59     //修改购物车中的商品数量  int  goods_id   $num number
     60     public function modNum($id,$num=1){
     61         if(!($this->hasItem($id))){
     62             echo "商品主键不存在,无法修改商品数量";
     63             return false;
     64         }
     65         $this->items[$id]['num'] = $num; 
     66     }
     67     //商品数量加一
     68     public function incNum($id){
     69         if(!($this->hasItem($id))){
     70             echo "商品主键不存在,无法增加商品";
     71             return false;
     72         }
     73         $this->items[$id]['num'] += 1; 
     74     }
     75     //商品数量减一
     76     public function decNum($id,$num=1){
     77         if(!($this->hasItem($id))){
     78             echo "商品主键不存在,无法减少商品";
     79             return false;
     80         }
     81         
     82         $this->items[$id]['num'] -= $num;
     83         //如果减少后商品数量为0了,则把商品从购物车删除 
     84         if($this->items[$id]['num'] <= 0)
     85             $this->delItem($id);
     86     }
     87     //删除商品 id
     88     public function delItem($id){
     89         unset($this->items[$id]);
     90     }
     91     //查询购物车中商品种类
     92     public function getCnt(){
     93         return count($this->items);
     94     }
     95     //查询购物车总商品的个数
     96     public function getNum(){
     97         $temp_num = 0;
     98         if($this->getCnt() == 0)//若购物车没有商品,数量自然为0
     99             $temp_num = 0;
    100         foreach($this->items as $item){
    101             $temp_num += $item['num'];
    102         }   
    103         return $temp_num;
    104     }
    105     //查询购物车总商品的总金额
    106     public function getPrice(){
    107         $temp_money = 0.0;
    108         if($this->getCnt() == 0)//若购物车没有商品,金额自然为0
    109             $temp_money = 0.0;
    110         foreach($this->items as $item){
    111             $temp_money += ($item['num'] * $item['price']);
    112         }   
    113         return $temp_money;
    114     }
    115     //返回购物车所有商品,空:返回商品数组  任意字符串:数组形式返回所有商品的名字
    116     public function getAllGoods($fun=''){
    117         if($fun == '')
    118             return $this->items;
    119         //返回所有商品的名字
    120         $temp_arr = array();
    121         foreach($this->items as $k=>$v){
    122             $temp_arr[] = array( $k=>$v['name'] );
    123         }
    124         return $temp_arr;
    125     }
    126 }
    127 /** php 测试 代码
    128 $cart = CartTool::getCart();
    129 if(isset($_GET['test']) && $_GET['test'] == 'add'){
    130     $cart->addItem('1',"雪",'88888');
    131     $cart->addItem('5',"雪1",'88888');
    132     $cart->addItem('8',"雪2",'88888');
    133     echo 'add ok';
    134 }else if(isset($_GET['test']) &&  $_GET['test'] == 'clear'){
    135     $cart->clearItem();
    136     echo "successufl ok";
    137 }else if(isset($_GET['test']) &&  $_GET['test'] == 'num'){
    138     $cart->modNum(8,3);
    139     echo "modify ok";
    140 }else if(isset($_GET['test']) &&  $_GET['test'] == 'add1'){
    141     $cart->incNum(8);
    142     echo "modify ok";
    143 }else if(isset($_GET['test']) &&  $_GET['test'] == 'dec1'){
    144     $cart->decNum(8);
    145     echo "modify ok";
    146 }else if(isset($_GET['test']) &&  $_GET['test'] == 'price'){
    147     echo "总共",$cart->getNum(),"种商品";
    148     $pri = $cart->getPrice();
    149     echo "总共",$pri,'元';
    150 }else if(isset($_GET['test']) &&  $_GET['test'] == 'all'){
    151     
    152     print_r( $cart->getAllGoods());
    153     echo "<hr/>";
    154     print_r( $cart->getAllGoods(1));
    155 }else{
    156     print_r($cart);
    157 }
    158 echo "<br/>";
    159 //print_r(CartTool::getCart());
    160  */
    161 ?>
  • 相关阅读:
    QPS、PV和需要部署机器数量计算公式
    libevent 源码深度剖析十三
    libevent源码深度剖析十二
    libevent源码深度剖析十一
    libevent源码深度剖析十
    libevent源码深度剖析九
    libevent源码深度剖析八
    ADO.NET入门教程(三) 连接字符串,你小觑了吗?
    配置文件的使用,如果要跨平台,建议直接用 xml, json, ini 或者本文档,看自己方便
    firemonkey 去掉ios 虚拟键盘上的‘done’toolbar
  • 原文地址:https://www.cnblogs.com/lihaiyan/p/4274390.html
Copyright © 2011-2022 走看看