将cart类与会话

时间:2016-03-01 08:41:15

标签: php oop session

我开始学习PHP类,接口,扩展以及与之相关的事情。

在此之前我只使用过函数,并且开始对单独函数的hundreads感到非常混乱。

根据我的需要,我的项目会有多个课程:

  1. 购物车类。这应该是非常通用的,因为在某些时候我可能需要将数据保存到数据库而不是会话。
  2. 计算类。将有大约15种产品和大约5种不同类型的计算。 (根据金额,基本价格,人均价格等)。
  3. 数据库类。这将用于从我的计算类的数据库中获取我的价格。
  4. 通过html表单从提交的数据创建一个包含MPDF的pdf(这也用于更新购物车金额并实时返回计算的价格)
  5. 然而,这只是为了暗示我想要实现的目标,所以它可以让你更好地理解我应该如何处理事情。

    现在提出实际问题。这是我的购物车类:

    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 />";
        }
    }
    }
    

    这几乎是我的购物车需要的功能,但这里是问题:

    1. 我的html表单包含每个项目的输入字段,用于确定要订购的相应项目的数量。在这种情况下,我需要单独的addItem()和updateItem()吗?因为新的价值无论如何都会改写旧的。

    2. 我应该在CartInterface中包含哪些方法?我知道任何使用CartInterface的类都被迫使用这些方法,但是我想强迫一个类使用这些方法的原因是什么?

    3. 最重要的问题是调整此课程以使用会话。众所周知,没有会话,购物车就没有多大用处。如何使用$ 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']); 
      
    4. 我感谢所有的帮助,也请指出糟糕的编码习惯,所以阅读这篇文章的每个人都会学到一些东西。

      长话短说:我应该采用什么方法让这个Cart类适用于会话?

1 个答案:

答案 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就是这样做的。