<转>php 购物车代码实例

<?php
if (!isset($_SESSION)) {
  session_start();
}
  //购物车类,单例模式,全站只有一个
  class CartTool {
       //存储对象
          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 getCart() {
        //如果不存在,或者session内容不是本类实例,就实例一遍
        //如果存在了,就不会再走这里了,session唯一的目的也就达到了
           if (!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)) {
            //将实例结果赋给session
              $_SESSION['cart'] = self::getIns();
           }
           //返回session(实例结果,即对象)
           return $_SESSION['cart'];
       }

       /**
         添加商品 addItem
         param int $id 商品id主键
         param string $name 商品名称
         param float $price 商品价格
         param int $num 购物数量
         将商品信息赋值给购物车items数组中,以ID为下标
       */
       public function addItem($id,$name,$price,$num = 1){
       
        //判断商品是否存在,如果存在,直接添加数量
        if ($this->hasItem($id)) {
           $this->incNum($id,$num);
           return ;
        }
        $item = array();
        $item['name'] = $name;
        $item['price'] = $price;
        $item['num'] = $num;
        
        //将items变成一个二维数组,以主键/$id 为下标
        $this->items[$id] = $item;
        
       }

      /**
        修改购物车的商品数量
        param int $id 商品主键
        param int $num 某个商品修改的数量,直接把商品替换覆盖
      */
       public function modNum($id,$num=1) {
        //如果这个商品不存在,直接false
         if (!$this->hasItem($id)) {
             return false;
         }

         $this->items[$id]['num'] = $num;
       }
      
      /**
       商品数量增加,默认是一 incNum
      */
        public function incNum($id,$num=1) {
          if ($this->hasItem($id)) {
             $this->items[$id]['num'] += $num;
          }

        }

       /**
       商品数量减少,默认是一 decNum
       */
       public function decNum($id,$num=1) {
          if ($this->hasItem($id)) {
             $this->items[$id]['num'] -= $num;
          }

          //减少到数量为0,则直接把商品删除
          if ($this->items[$id]['num'] < 0) {
             $this->delItem[$id];
          }
       }

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

      /**
       判断商品是否存在 hasItem()
       return bool 商品是否存在于items(二维数组)中,用$id来判断;
      */
       public function hasItem($id) {
        return array_key_exists($id, $this->items);
       }
      
      /**
         判断购物车里商品的种类
         return int 总类
      */
         public function getCnt(){
          return count($this->items);
         }
       /**
         判断购物车里商品数量
         return int $sum总数
         */
         public function getNum(){
          //如果种类为0,商品自然也为0
          if ($this->getCnt() == 0) {
            return 0;
          }
          
          //初始化数量
          $sum = 0;
          
          //遍历计算出商品数量
          foreach ($this->items as  $item) {
             $sum += $item['num'];
          }

          return $sum;
         }  


      /**
      计算出商品总额getPrice()
      return float 总额
      */
      public function getPrice(){
        if ($this->getCnt() == 0) {
          return 0;
        }
        //初始化成浮点型
        $price = 0.0;
        
        //遍历出价格和数量,算出总额
        foreach ($this->items as $item) {
            $price += $item['num'] * $item['price'];
        }
        return $price;
      }  

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

      /**
       清空购物车
      */
        public function clear() {
          //将商品初始化为空数组
          $this->items = array();
        }
  }

  // print_r(CartTool::getCart());

?>

posted on 2015-11-11 22:16  hahahahahai12  阅读(124)  评论(0)    收藏  举报

导航