购物车类 单例+session 结合

<?php
class cart{
	static public $ins = null;
	public $rand = 0;
	public $item = array();

	protected function __construct(){
		$this->rand = mt_rand(0,9999);
	}

	public static function getIns(){
		if(!(self::$ins instanceof self)){
			self::$ins = new self();
			return self::$ins;
		}
		return self::$ins;
	}

	//全局有效  /?id=112  ?id=121d 都行
	public static function getCart(){
		if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)){
			return $_SESSION['cart'] = self::getIns();
		}
		return $_SESSION['cart'];
	}

	//添加商品到购物车 如果存在则数量加一
	public function addItem($id,$name,$price,$num){

		if($this->hasItem($id)){
			$this->incNum($id);
		}else{
			$item = array();
			$item['goods_id'] = $id;
			$item['goods_name'] = $name;
			$item['shop_price']  = $price;
			$item['num'] = $num;
			$this->item[$id] = $item;
		}

	}

	//判断购物车是否存在该商品
	public function hasItem($id){
		return array_key_exists($id,$this->item);
	}

	//获取商品的种类数
	public function getCnt(){
		return count($this->item);
	}

	//修改商品数量 默认加一
	public function incNum($id,$num=1){
		$this->item[$id]['num']+=1;
	}

	//修改商品数量 默认减一
	public function decNum($id,$num=1){
		$this->item[$id]['num']-=1;
	}

	//修改数量
	public function modNum($id,$num){
		$this->item[$id]['num'] = $num;
	}

	//计算所有商品的总价
	public function countAll(){

		if($this->getCnt() == 0){
			return 0;
		}

		foreach($this->item as $key=>$val){
			$count+=$val['num']*$val['shop_price'];
		}

		return $count;
	}

	//获取所有购物车商品
	public function getAllItem(){
		return $this->item;
	}

	//清除购物车
	public function clear(){
		unset($this->item);
	}

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




}

session_start();
$cart = cart::getCart();
if($_GET['act'] == "addwangba"){
	$cart->addItem('10','王八','60','2');
}elseif ($_GET['act'] == "addwangwu"){

	$cart->addItem('12','王五','60','2');
}elseif ($_GET['act'] == 'clear'){
	$cart->clear();
}elseif($_GET['act'] == 'del'){
	$cart->del($_GET['id']);
}



echo '<pre>';
print_r($_SESSION['cart']);
echo '共有'.$cart->getCnt() .'种商品<br>';
echo '一共'.$cart->countAll() .'元<br>'
?> 



关键代码:

public static function getIns(){
		if(!(self::$ins instanceof self)){
			self::$ins = new self();
			return self::$ins;
		}
		return self::$ins;
	}

	//全局有效  /?id=112  ?id=121d 都行
	public static function getCart(){
		if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)){
			return $_SESSION['cart'] = self::getIns();
		}
		return $_SESSION['cart'];
	}

或者说:整站范围内,购物车--是全局有效的!

解决:把购物车的信息放在数据库,也可以放在session/cookie里



2:既然是全局有效,暗示,购物车的实例只能有1个!
不能说在3个页面,买了3个商品,就形成了3个购物车实例,这显然不合理.
解决:单例模式



第一步:先要单例 作用:不能在外部实例化 要cart::getIns 创建对象 无论创建多少个对象 都是同一个对象  但此时如果重新刷新页面 或者到 另一个页面 对象也会变化 因为距会重新实例化

第二部:将对象放入 session  作用:全局有效


一开始还没搞明白 session+单例时做的实验

//$a = cart::getIns();  
//$b = cart::getIns();
//print_r($a);  同一个页面 $a $b 都是同一个对象   如果没有单例的话  $a $b 就不是同一个对象
//print_r($b);


//print_r(cart::getIns());
//print_r(cart::getCart());
//$_SESSION['cart'] =cart::getIns();    这样直接把对象赋给 session  起不到全局的作用 因为cart::getIns()像上一步所说的 会变的 
//print_r($_SESSION['cart']);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值