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] ...
随机推荐
- ubuntu制作usb启动盘
准备: u盘 iso镜像文件--ubuntu-12.04.2-desktop-amd64.iso 烧盘软件--unetbootin-linux-583 步骤: 格式化u盘 查看u盘信息 #mount/ ...
- 一些收费的vpn或ssh代理
www.expressvpn.com TorGuard: https://help.ubuntu.com/community/Tor?action=show&redirect=TOR h ...
- 数学常数e的含义
转载: http://www.ruanyifeng.com/blog/2011/07/mathematical_constant_e.html 作者: 阮一峰 日期: 2011年7月 9日 1. ...
- hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- hdoj 4883 TIANKENG’s restaurant【贪心区间覆盖】
TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/O ...
- 层层递进Struts1(七)详解DispatchAction
通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的Dispatch ...
- 贪心+容器 hdu4268
Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this game, ...
- 如何注册dll、ocx控件
在程序集成时,有时需要对厂家提供的dll或者ocx控件进行注册.其一般操作为:开始>命令指示符(右击管理员身份运行)>regsvr32 文件路径. 比如对devocx.ocx进行注册,在F ...
- MST(Kruskal’s Minimum Spanning Tree Algorithm)
You may refer to the main idea of MST in graph theory. http://en.wikipedia.org/wiki/Minimum_spanning ...
- Winform 中 DesignMode 返回值不正确的问题。
本文转载:http://blog.csdn.net/sabty/article/details/5325260 以前也曾遇到这样的问题,不过影响不大也没有去详细了解.今天又重新遇到此问题,实在太不便. ...