閱讀161 返回首頁    go 技術社區[雲棲]


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


?>

最後更新:2017-04-04 07:03:11

  上一篇:go 著名硬件黑客黃欣國正在設計開源筆記本
  下一篇:go Winform獲取本地IP和外網IP