php之购物车类思路及代码

简介: <?php /* 购物车类 1.整站范围内,购物车--全局有效 解决:把购物车的信息,放在session里 2.既然全局有效,购物车的实例只有一个 解决:单例模式 技术选型:session+单例 功能分析 判断商品是否存在 添加商品 删除商品 修改商品的数量 某商品数量+1 某商品数量-1 查看购物车的商品种类 商品数量
<?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);
}


?>

目录
相关文章
|
1月前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
2月前
|
安全 程序员 PHP
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第8天】在编程的世界中,错误和异常是不可避免的。它们就像路上的坑洼,可能会让我们的程序“跌倒”。但是,如果我们能够正确地处理这些异常,就可以让我们的程序更加稳健,就像我们学会了如何在坑洼的路上稳稳地行走一样。本文将介绍PHP中的异常处理机制,以及如何使用它来提升我们的代码质量。
|
24天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
21 1
|
1月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
39 6
|
27天前
|
PHP 开发者 UED
探索PHP中的异常处理:提升代码的健壮性
在PHP开发中,优雅地处理错误和异常是确保应用稳定性和用户体验的关键。本文将通过深入浅出的方式,介绍如何在PHP中实现有效的异常处理机制,包括异常的基本概念、如何抛出和捕获异常,以及最佳实践。准备好让你的代码变得更加健壮和可靠吧!
20 2
|
1月前
|
PHP 开发者
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第40天】在PHP编程中,异常处理是确保应用稳定性的关键。本文将引导你理解异常处理的重要性,掌握如何在PHP中捕获和处理异常,以及如何通过自定义异常类来增强代码的错误管理能力。我们将一起探索如何利用PHP的异常处理机制,打造一个更加健壮和可靠的应用程序。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
2月前
|
程序员 数据库连接 PHP
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第30天】在编程的世界里,错误和异常是不可避免的。本文将深入探索PHP中异常处理的机制,揭示如何通过有效的异常管理来增强代码的健壮性和可靠性。我们将从基础概念出发,逐步深入到高级应用,最后通过实际代码示例来巩固理论知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
52 6
|
2月前
|
PHP 开发者 UED
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第8天】在编程世界中,错误和异常是不可避免的。它们如同路上的绊脚石,让我们的程序跌倒。但如果我们学会了如何处理这些异常,就能像学会走路的孩子一样,即使跌倒也能爬起来继续前进。本文将引导你如何在PHP中捕获并处理异常,让你的代码更加健壮,能够优雅地面对各种挑战。