<?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']);