<?php
/*
购物车类 1.整站范围内,购物车--全局有效
解决:把购物车的信息,放在session里 2.既然全局有效,购物车的实例只有一个
解决:单例模式 技术选型:session+单例 功能分析
判断商品是否存在
添加商品
删除商品
修改商品的数量 某商品数量+1
某商品数量-1 查看购物车的商品种类
商品数量
商品的总金额
所有商品 清空购物车
*/
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() {
//如果cart在session不存在,并且 也不是当前自身类的实例,
//说明session里没有购物车
if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)) {
$_SESSION['cart'] = self::getIns();
}
return $_SESSION['cart'];
} /*
添加商品
param int $id 商品主键
string $name 商品名称
float $price 商品价格
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;
} /*
修改购物车中的商品数量
int $id 商品主键
int $num 某商品修改后的数量,即直接把某商品
的数量改为$num
*/
public function modNum($id,$num=1) {
if (!$this->hasItem($id)) {
return false;
}
$this->items[$id]['num'] = $num;
} /*
商品数量+1
*/
public function incNum($id,$num=1) {
if ($this->hasItem($id)) {
$this->items[$id]['num'] += $num;
}
} /*
商品数量+1
*/
public function decNum($id,$num=1) {
if ($this->hasItem($id)) {
$this->items[$id]['num'] -= $num;
} //如果减少后,数量为0,则把这个商品删掉
if ($this->items[$id]['num'] <1) {
$this->delItem($id);
}
} /*
判断商品是否存在
*/ public function hasItem($id) {
return array_key_exists($id,$this->items);
} /*
删除商品
*/
public function delItem($id) {
unset($this->items[$id]);
} /*
查询购物车中商品的种类
*/
public function getCnt() {
return count($this->items);
}
/*
查询购物车中商品的个数
*/
public function getNum(){
if ($this->getCnt() == 0) {
//种数为0,个数也为0
return 0;
} $sum = 0;
foreach ($this->items as $item) {
$sum += $item['num'];
}
return $sum;
} /*
购物车中商品的总金额
*/
public function getPrice() {
//数量为0,价钱为0
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();
} } //print_r(CartTool::getCart());
/* 测试*/
$cart = CartTool::getCart();
if (!isset($_GET['test'])) {
$_GET['test'] = '';
} if ($_GET['test'] == 'addpm') {
$cart->addItem(1,'手机','1999',1);
echo "购买手机成功";
}elseif ($_GET['test'] == 'addfushi') {
$cart->addItem(2,'阿迪达斯','169',1);
echo '购买阿迪达斯成功';
} elseif ($_GET['test'] == 'clear') {
$cart->clear();
echo "购物车已清空";
}elseif ($_GET['test'] == 'show') {
print_r($cart->all());
echo "<br />";
echo '共'.$cart->getCnt().'种'.$cart->getNum().'个商品';
echo '共'.$cart->getPrice().'元';
} else{
print_r($cart);
} ?>

php之购物车类思路及代码的更多相关文章

  1. JavaWeb后台购物车类的具体实现

    相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...

  2. 【转】Android自定义Adapter的ListView的思路及代码

    原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下   在开发中,我们经常使 ...

  3. 用Java实现断点续传的基本思路和代码

    用Java实现断点续传的基本思路和代码   URL url = new URL(http://www.oschina.net/no-exist.zip); HttpURLConnection http ...

  4. PHP购物车类

    <?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = arr ...

  5. ASP.NET 大文件下载的实现思路及代码

    文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ...

  6. PHP商城购物车类

    <?php /* 购物车类 */ // session_start(); class Cart { //定义一个数组来保存购物车商品 private $iteams; private stati ...

  7. HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  8. Java中,类与类,类中的代码执行顺序

    代码的执行顺序如下: 1.一个类的静态代码块.构造代码块.构造方法的执行流程为: 静态代码块 > 构造代码块 > 构造方法 2.静态的内容是随着类的加载而加载,静态代码块的内容会优先执行 ...

  9. ThinkPHP5 核心类 Request 远程代码漏洞分析

    ThinkPHP5 核心类 Request 远程代码漏洞分析 先说下xdebug+phpstorm审计环境搭建: php.ini添加如下配置,在phpinfo页面验证是否添加成功. [XDebug] ...

随机推荐

  1. MIPI D-PHY 总结

    Operating Modes: Control, High-Speed, and Escape 1.The Lane is only in High-Speed mode during Data b ...

  2. 公有云开启全面竞争时代——青云QingCloud

    网界网本期[封面报道]公有云开启全面竞争时代 [CNW.com.cn 专稿] 险滩急流之后,公有云[注]服务市场的开拓者们终于看到了一片丰饶之海. 2013年,中国云计算[注]产业起步的第五年,公有云 ...

  3. lightoj 1018 dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1018 #include <cstdio> #include <cst ...

  4. 让nginx支持文件上传的几种模式

    文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单.只有语言的差别, ...

  5. 使用EF连接现有数据库

    新建个项目---在项目内添加新建项-- 选择ADo.NET实体数据模型(我的软件vs2012 上面之所以有两个ADo.NET实体数据模型 是因为上面一个EF4.0 下面一个EF5.0 ) 在实际操作中 ...

  6. unique mapped reads

    就是指唯一比对的reads 现在人们已经开始避免使用unique mapped reads这个概念了,而转向使用mapq值来保留高质量的比对结果.因为mapq值反应了一组比对结果发生的可能性,MapQ ...

  7. IOS 表视图UITableView 束NSBundle

    今天搞了一下表视图UITableView 表视图是在以后应用程序开发中经常用到的一个视图,所以必须要熟练掌握 所获不多,对视图有了一个大概的了解 其中有用到NSBundle , 束   这个类 先说一 ...

  8. LINQ 从 CSV 文件生成 XML

    本文参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 下面的代码对字符串数组执行 LINQ 查询. 在 C# 版本中,该查询使用 let ...

  9. Lucene.Net+盘古分词

    前言 各位朋友,谢谢大家的支持,由于文件过大,有考虑到版权的问题,故没有提供下载,本人已建立一个搜索技术交流群:77570783,源代码已上传至群共享,需要的朋友,请自行下载! 首先自问自答几个问题, ...

  10. Qt 学习之路 :文件

    文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统. Qt 通过QIODevice提 ...