php之购物车类思路及代码
<?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之购物车类思路及代码的更多相关文章
- JavaWeb后台购物车类的具体实现
相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...
- 【转】Android自定义Adapter的ListView的思路及代码
原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使 ...
- 用Java实现断点续传的基本思路和代码
用Java实现断点续传的基本思路和代码 URL url = new URL(http://www.oschina.net/no-exist.zip); HttpURLConnection http ...
- PHP购物车类
<?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = arr ...
- ASP.NET 大文件下载的实现思路及代码
文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ...
- PHP商城购物车类
<?php /* 购物车类 */ // session_start(); class Cart { //定义一个数组来保存购物车商品 private $iteams; private stati ...
- HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Java中,类与类,类中的代码执行顺序
代码的执行顺序如下: 1.一个类的静态代码块.构造代码块.构造方法的执行流程为: 静态代码块 > 构造代码块 > 构造方法 2.静态的内容是随着类的加载而加载,静态代码块的内容会优先执行 ...
- ThinkPHP5 核心类 Request 远程代码漏洞分析
ThinkPHP5 核心类 Request 远程代码漏洞分析 先说下xdebug+phpstorm审计环境搭建: php.ini添加如下配置,在phpinfo页面验证是否添加成功. [XDebug] ...
随机推荐
- HashMap和Hashtable
HashTable 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 速 ...
- cas 单点登录配置
服务端配置 cas是个好东西,很灵活很好用,但是配置起来很麻烦 cas官方网站 http://downloads.jasig.org/ 下载服务端 CAS Server 3.3.3 Final 1.将 ...
- Musical Theme - poj 1743(求最大不重叠重复子串)
题目大意: * 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题. * “主题”是整个音符序列的一个子串,它需要满 ...
- Oracle中trunc函数、round 函数、ceil函数和floor函数的使用
Oracle中trunc函数.round 函数.ceil函数和floor函数的使用 1.1trunc函数处理数字 trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定 ...
- ecshop获取客户端操作系统
<?php /** * 获得客户端的操作系统 * * @access private * @return void */ function get_os() { if (empty($_SERV ...
- 10881 - Piotr's Ants(排序)
题目链接:10881 - Piotr's Ants 题目大意:在一个长为L的木棒上有n只蚂蚁,给出蚂蚁的初始位置以及方向,问说移动T秒后各个蚂蚁的位置以及状态,如果两只蚂蚁在移动的过程中相撞,则会同时 ...
- .net 4中的pInvokeStackImbalance MDA默认是开启的
今天把我之前发的一个小工具FreeEverything(基于everything的一个简易磁盘清理工具)升级到了.net framework 4.5,并且去掉了对mvvmlight的依赖.结果在测试运 ...
- Delphi中一些常用的组合键值
Delphi中一些常用的组合键值 CTRL+A: #1 CTRL+B: #2 CTRL+C: #3 CTRL+D: #4 CTRL+E: #5 CTRL+F: #6 CTRL+G: #7 ...
- OpenCV与QT联合编译 分类: Eye_Detection ZedBoard OpenCV shell ubuntu 2014-11-08 18:54 143人阅读 评论(0) 收藏
问题1:首先参考rainysky的博客,发现qmake时发生找不到目录,文件的错误,又找不到 qmake.conf 文件的写法.所以开始按照网上的程序修改 XXX.pro 文件. 问题2:使用QT C ...
- Groovy新手教程
Groovy新手教程 kmyhy@126.com 2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也执行在 JVM 中. 作为跑在JVM ...