PHP实现,商城购物车类的开发步骤流程
很久以前写的一篇文章,在csdn里面,哈哈,现在我把他移过我的博客里面来,本来我的博客文章就不多,能加一篇算一篇
购物车的开发:
购物车需求,及选型
/**
购物车类
1.整站范围无论刷新多少页面 增加多少商品查看的时候都是一个结果 全局有效
答 可放入数据库 可放在session里
2.全局有效 购物车提示只有一个实例
答 单例模式
技术选型 session + 单例
功能分析:
判断商品是否存在
添加商品
删除商品
某个商品数量加一
某个商品数量减一
查询购物车商品的种类
查询购物车商品的数量
查询购物车商品的总金额
返回购物车的所有商品
清理购物车
**/
完整购物车类,当年我测的时候没有啥问题,感兴趣你也可以测测
class CartTool {
private static $ins = NULL; //存放实例
private $items = array(); //存放商品
final protected function __construct(){ //构造方法阻止new 保护起来
}
final protected function __clone(){ //阻止克隆方法
}
//内部开放获取实例的保护起来 因为开放一个getCart就够了
protected static function getIns(){
if (!(self::$ins instanceof self)) { //判断这个实例是否是自身 不是的话
self::$ins = new self(); //创建一个
}
return self::$ins;
}
//想要单例有效 需要把购物车的单例对象放到session里
public static function getCart() {
//判断session里没有cart这个实例 或 这个实例不是自身的实例
if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)){
//那我就新创建一个实例 把它添加到session里
$_SESSION['cart'] = self::getIns();
}
return $_SESSION['cart'];
}
/*购物车的框架搭上 后面就写方法 功能*/
/*添加商品
param int $id 商品主键
param string $name 商品名称
param float $price 商品价格
param int $num 购物数量
*/
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;
$this->items[$id] = $item; //把存好商品信息放到items这个数组的$id里面
}
/*
修改商品数量
param int $id 商品主键
param int $num 某个商品修改后的数量 即直接把某商品的数量改为$num
*/
public function modNum($id,$num=1) {
if(!$this->hasItem($id)){
return false;
}
$this->items[$id]['num'] = $num; //直接把数组id里面的num值改成 传过来的$num
}
/*
某商品数量加一
param int $id 商品主键
*/
public function incNum($id,$num=1){
if ($this->hasItem($id)) {
$this->items[$id]['num'] += $num;
}
}
/*
某商品数量减一
param int $id 商品主键
*/
public function decNum($id,$num=1){
if ($this->hasItem($id)) {
$this->items[$id]['num'] -= $num;
}
if ($this->items[$id]['num'] < 1) {//如果减少后 数量为0 则把这个商品从购物车删除
$this->delItem($id);
}
}
/*
判断某商品是否存在
param int $id 商品主键
*/
public function hasItem($id){
return array_key_exists($id, $this->items); //判数组里面是否有id
}
/*
删除商品
*/
public function delItem($id){
unset($this->items[$id]);
}
/*
查询购物车中商品的种类
*/
public function getCnt(){
return count($this->items);
}
/*
查询购物车中商品的个数
*/
public function getNum(){
if ($this->getCnt() == 0) {
return 0;
}
$sum = 0;
foreach ($this->items as $item) {
$sum += $item['num'];
}
return $sum;
}
/*
查询购物车里面商品的总金额
*/
public function getPrice(){
if ($this->getCnt() == 0) {
return 0;
}
$price = 0.0;
foreach ($this->items as $item) {
$price += $item['num'] * $item['price']; //总金额 += 商品的数量*商品的单价
}
return $price;
}
/*
返回购物车里面的所有商品
*/
public function all(){
return $this->items;
}
//清空购物车
public function clear(){
$this->items = array();
}
}
测试,调试代码
//静态调用把单例放到session里的方法
//测试能否得到一个实例 在测试更换地址实例改变说明没有放到sesion里
//print_r(CartTool::getCart());
$cart = CartTool::getCart();
if(!isset($_GET['test'])){
$_GET['test'] = '';
}
if ($_GET['test'] == 'wb') {
$cart->addItem(1,'王八',100.5,1);
echo 'add wb';
}else if($_GET['test'] == 'fz'){
$cart->addItem(2,'方舟',3000,1);
echo 'add fz';
}else if ($_GET['test'] == 'clear') {
$cart->clear();
}else if ($_GET['test'] == 'show'){
print_r($cart->all());
echo '<br />';
echo $cart->getCnt(),'种商品','<br />';
echo $cart->getNum(),'个商品','<br />';
echo $cart->getPrice();
}else {
print_r($_SESSION);
print_r($cart);
}
完
相关文章