我开始学习PHP类,接口,扩展以及与之相关的事情。
在此之前我只使用过函数,并且开始对单独函数的hundreads感到非常混乱。
根据我的需要,我的项目会有多个课程:
然而,这只是为了暗示我想要实现的目标,所以它可以让你更好地理解我应该如何处理事情。
现在提出实际问题。这是我的购物车类:
interface CartInterface {
public function addItem($id, $amount, $months);
public function updateItem($id, $amount, $months);
public function deleteItem($id);
public function countItems();
public function getCart();
public function ifIdExists($id);
}
class Cart implements CartInterface {
public $cart = array();
public function addItem($id, $amount, $months) {
if($this->ifIdExists($id)){
$this->updateItem($id, $amount, $months);
}
else {
$this->cart[$id]['id'] = $id;
$this->cart[$id]['amount'] = $amount;
$this->cart[$id]['months'] = $months;
}
}
public function updateItem($id, $amount, $months) {
$this->cart[$id]['id'] = $id;
$this->cart[$id]['amount'] = $amount;
$this->cart[$id]['months'] = $months;
}
public function deleteItem($id) {
unset($this->cart[$id]);
}
public function countItems() {
return count($this->cart);
}
public function getCart() {
return $this->cart;
}
public function ifIdExists($id) {
$exists = false;
if(array_key_exists($id, $this->cart)) {
$exists = true;
}
else {
$exists = false;
}
return $exists;
}
public function showCart() {
foreach($this->cart as $value) {
echo "<br />";
echo 'Id:'. $value['id'] ;
echo "<br />";
echo 'Amount:'.$value['amount'];
echo "<br />";
echo 'Months:'.$value['months'];
echo "<br />";
}
}
}
这几乎是我的购物车需要的功能,但这里是问题:
我的html表单包含每个项目的输入字段,用于确定要订购的相应项目的数量。在这种情况下,我需要单独的addItem()和updateItem()吗?因为新的价值无论如何都会改写旧的。
我应该在CartInterface中包含哪些方法?我知道任何使用CartInterface的类都被迫使用这些方法,但是我想强迫一个类使用这些方法的原因是什么?
最重要的问题是调整此课程以使用会话。众所周知,没有会话,购物车就没有多大用处。如何使用$ cart-&gt; deleteItem()来删除会话中的项目?我是否需要创建一个单独的SessionCart类,它具有与Cart相同的方法但处理会话?
$cart = new Cart();
$cart->addItem('1', '30', '2');
$cart->addItem('2', '306', '12');
$cart->addItem('6', '306', '12');
$cart->deleteItem('1');
// Here i create a session array from the cart but cart's class methods won't work
$cart = $cart->getCart();
$_SESSION['cart'] = $cart;
$cart->deleteItem('1'); // This won't effect the session cart
print_r($_SESSION['cart']);
我感谢所有的帮助,也请指出糟糕的编码习惯,所以阅读这篇文章的每个人都会学到一些东西。
长话短说:我应该采用什么方法让这个Cart类适用于会话?
答案 0 :(得分:0)
正如我在上面评论的那样,不要以直接的方式暴露你的内部运作。您的购物车正在内部使用阵列,但阵列是购物车的一部分,而不是整个购物车。仅将数组放在会话中意味着您放弃了面向对象的设计。我建议对初学者进行修改。
$cart = new Cart();
$cart->addItem('1', '30', '2');
$cart->addItem('2', '306', '12');
$cart->addItem('6', '306', '12');
//$cart = $cart->getCart(); //This is not necessary
$_SESSION['cart'] = $cart; //This will put the object itself in the session.
$cart->deleteItem('1'); // This should now affect the object
var_dump($_SESSION['cart']);
在请求结束时,会话中的所有对象都使用serialize()进行序列化,因此您不必担心PHP如何做到这一点,您只需要知道PHP就是这样做的。