对于购物商城网站来说,如果网站没有购物车,那么对商城老板来说这网站将会毫无意义!
当然每次搬砖之前的先分析砖的特点,因为这样搬起砖来又快,又省力,又不赚钱,但是掉头发会慢点!( ⊙ o ⊙ )!
商城购物车有如下特点:
1.在整站范围内有效,且购物车实例只能有一个(单例模式)
2.保持数据的持久性
①放在session
②放在数据库里
③放在cookie里
现在为了保持持久性,基本都把数据存在数据库中,因为其他形式保存数据不够稳定
那么作为范例,这次就把它放在session里。至于购物车的基本功能将会在代码中注释!
//session+单例模式
/**
* 功能分析:
* 添加商品,
* 删除
* 修改
* 查询商品种类,数量,总金额,返回所有商品
* 清空购物车
*/
session_start();
class GoodsCarTool{
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 getCar(){
if(!isset($_SESSION['car']) || !($_SESSION['car'] instanceof self)){
$_SESSION['car'] = self::getIns();
}
return $_SESSION['car'];
}
//添加商品
/**
*$id 商品主键(货号)
*$name 商品名
*$price 商品价格
* $num 购物数量
*/
public function addItem($id,$name,$price,$num=1){
//如果该商品已经存在则直接在原来的数量上加
if($this->hasItem($id)){
$this->addNum($id,$num);
return;
}
$item = array();
$item['name'] = $name;
$item['price'] = $price;
$item['num'] = $num ;
$this->items[$id] = $item;
}
/**
* 判断某商品是否存在
*/
public function hasItem($id){
return array_key_exists($id,$this->items);
}
/**
*修改购物车中的商品数量
*id 商品主键
*num 某个商品修改后的数量,
* 即直接把某商品的数量改为num
*/
public function modNum($id,$num){
if(!$this->hasItem($id)){
return false;
}
$this->items[$id]['num'] = $num;
}
/**
* 商品数量的添加1
*/
public function addNum($id,$num=1){
if($this->hasItem($id)){
$this->items[$id]['num'] +=$num;
}
}
/**
* 商品数量的减1
*/
public function subNum($id,$num=1){
if($this->hasItem($id)){
$this->items[$id]['num'] -=$num;
}
//如果数量减少到0,则把这个商品从购物车中删除掉
if($this->items[$id]['num']<1){
$this->delItem($id);
}
}
/**
* 删除商品
*/
public function delItem($id){
unset($this->items[$id]);
}
/**
* 查询购物车中商品的种类
*/
public function getCate(){
return count($this->items);
}
/**
*查询购物车中商品的个数
*/
public function getNum(){
if($this->getCate() == 0){
return 0;
}
$sum = 0;
foreach ($this->items as $item) {
$sum += $item['num'];
}
return $sum;
}
/**
* 查询购物车中的商品总金额
*/
public function getPrice(){
if($this->getCate() == 0){
return 0;
}
$price = 0.00;
foreach($this->items as $item){
$price += $item['num'] * $item['price'];
}
return $price;
}
/**
* 返回购物车中的所有商品
*/
public function allGoods(){
return $this->items;
}
/**
* 清空购物车
*/
public function clear(){
$this->items = array();
}
}
调用示例:
$car = GoodsCarTool::getCar();
$act = isset($_GET['test'])?$_GET['test']:'';
if($act=='add'){
$car->addItem(1,'王八',23.4,2);
echo 'ok';
}else if($act=='addfz'){
$car->addItem(2333,'方舟',235878.4,1);
echo 'ok';
}else if($act=='cle'){
$car->clear();
print_r($car);
}else if($act=='all'){
print_r($car->allGoods());
echo '<br>';
echo '共',$car->getCate(),'种,',$car->getNum(),'个商品</br>';
echo '共',$car->getPrice(),'元';
}