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);
}

?>
时间: 2024-10-09 04:00:52

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

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

原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快捷方式.例如ArrayAdapter.SimpleAdapter和SimpleCursorAdapter等.但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位.假设一行里面有一个按钮

购物车类分析session+single

<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品.打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的. * 解决:将购物车的信息放在数据库,也可以放在session里. * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析

在类里面写代码,代替xml文件

就是这个,以前还真没有做过,这不,这次就见识过了.然后希望给自己一份记忆,给你们一份快捷而已... /** * 代码中设置一般selector * * @param context * @param idNormal * @param idSelected * @param idFocused * @param idUnable * @return */ public static StateListDrawable newSelector(Context context, Drawable i

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

文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代码. 当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

PHP购物车类

<?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = array(); protected function __construct(){} // 获取实例 protected static function getIns(){ if(!(self::$ins instanceof self)){ self::$ins = new self(); } return

编程算法 - 不能被继承的类(私有构造函数) 代码(C++)

不能被继承的类(私有构造函数) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 用C++设计一个不能被继承的类. 可以使用私有构造函数, 并提供静态成员函数, 返回和删除类的实例. 则只能在堆上创建实例, 不能在栈上创建. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list> us

Java作业03 (动手动脑和课后作业1.使用下面定义的类,以下代码输出结果是什么?)

1.使用下面定义的类,以下代码输出结果是什么? 输出结果: 请依据代码的输出结果,自行总结Java字段初始化的规律. Java初始化的地方有两个:初始化块和构造函数,其中初始化又分为实例初始化块和静态初始化块,实例初始化块没有关键字修饰,而静态初始化块由static修饰. 执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面” 执行类的构造函数:类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行.因此,适合于封装那些“对象创建时必须执行的代码”. 2.

购物车类2分析session+single

<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品.打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的. * 解决:将购物车的信息放在数据库,也可以放在session里. * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析

C#实现为类和函数代码自动添加版权注释信息的方法

本文实例讲述了C#实现为类和函数代码自动添加版权注释信息的方法,分享给大家供大家参考之用.具体方法如下: 以web项目为例: 一:给类加注释 1.在visual studio 的安装路径下 如:[盘符]:/Program files/Microsoft Visual Studio 8/Common7/IDE/ItemTemplates/web/cshare/2052/class.zip ,将里面的class.cs改为: /*------------------------------------