将session封装入一个简单的购物车类之中,
请参考PHP学习记录的相应文章。

每件商品要求具备id,name,price,count四个属性,
如果你要加新的属性,请修改相应部分。

*************************/

class TCart {

var $SortCount; //商品种类数
var $TotalCost; //商品总价值

var $Id; //每类商品的ID(数组)
var $Name; //每类商品的名称(数组)
var $Price; //每类商品的价格(数组)
var $Count; //每类商品的件数(数组)
var $Cost; //每类商品的价值(数组)


//******构造函数
function TCart(){
$this->SortCount=0;

session_start(); //初始化一个session
session_register('sId');
session_register('sName');
session_register('sPrice');
session_register('sCount');

$this->Update();
$this->Calculate();

}

//********私有,根据session的值更新类中相应数据
function Update(){
global $sId,$sName,$sPrice,$sCount;

if(!isset($sId) or !isset($sName) or !isset($sPrice)) return;

$this->Id=$sId;
$this->Name=$sName;
$this->Price=$sPrice;
$this->Count=$sCount;

$this->SortCount=count($sId);

}

//********私有,根据新的数据计算每类商品的价值及全部商品的总价
function Calculate(){
for($i=0;$i<$this->SortCount;$i++){
$this->Cost[$i]=$this->Price[$i]*$this->Count[$i];
$this->TotalCost += $this->Cost[$i];
}
}


//**************以下为接口函数

//*** 加一件商品
// 判断是否蓝中已有,如有,加count,否则加一个新商品
//首先都是改session的值,然后再调用update() and calculate()来更新成员变量
function AddOne($id,$na,$pr){
global $sId,$sName,$sPrice,$sCount;

$k=count($sId);
for($i=0;$i<$k;$i++){ //先找一下是否已经加入了这种商品
if($sId[$i]==$id){
$sCount[$i]++;
break;
}
}
if($i>=$k){ //没有则加一个新商品种类
$sId[]=$id;
$sName[]=$na;
$sPrice[]=$pr;
$sCount[]=1;
}

$this->Update(); //更新一下类的成员数据
$this->Calculate();
}

//移去一件商品
function RemoveOne($id){
global $sId,$sName,$sPrice,$sCount;

$k=count($sId);
for($i=0;$i<$k;$i++){
if($sId[$i]==$id){
$sCount[$i]--;
break;
}
}

$this->Update();
$this->Calculate();
}

//改变商品的个数
function ModifyCount($i,$ncount){
global $sCount;

$sCount[$i]=$ncount;

$this->Update();
$this->Calculate();

}

//清空一种商品
function EmptyOne($i){
global $sCount;

$sCount[$i]=0;

$this->Update();
$this->Calculate();
}


/***************************
清空所有的商品

因为在win里PHP不支持session_destroy()函数,所以这个清空函数不完善,
只是把每种商品的个数置为0。
如果是在linux下,可以直接用session_destroy()来做。
*****************************/
function EmptyAll(){
global $sId,$sName,$sPrice,$sCount;

$k=count($sId);
for($i=0;$i<$k;$i++){
$sCount[$i]=0;
}

$this->Update();
$this->Calculate();

session_unregister('sId');
session_unregister('sName');
session_unregister('sPrice');
session_unregister('sCount');

$this->SortCount=0;

}

//是否某件商品已在蓝内,参数为此商品的ID
function InCart($id){
for($i=0;$i<$this->SortCount;$i++){
if($this->Id[$i]==$id) return TRUE;
}
return FALSE;
}

//某件商品在蓝内的位置
function IndexOf($id){
for($i=0;$i<$this->SortCount;$i++){
if($this->Id[$i]==$id) return $i;
}
return 0;
}

//取一件商品的信息,主要的工作函数
//返回一个关联数组,下标分别对应 id,name,price,count,cost
function GetOne($i){
$Result[id]=$this->Id[$i];
$Result[name]=$this->Name[$i];
$Result[price]=$this->Price[$i];
$Result[count]=$this->Count[$i];
$Result[cost]=$this->Cost[$i];

return $Result;
}

//取总的商品种类数
function GetSortCount(){
return $this->SortCount;
}

//取总的商品价值
function GetTotalCost(){
return $this->TotalCost;
}

//end class
}