2011-09-29 39 views
1

我设法实现的OOP Cart购物篮增加数量时添加相同的选项

一个项目包含1个或多个选项。

如果我再次添加相同的OptionID,那么数量应增加,而不是创建另一个Option对象。如何做到这一点?

如果我再次添加相同的ItemID,它应该拒绝创建另一个Item对象。

另外是我的OOP是好的?

class Cart { 

     public $item = array(); 

     public function addItem($id) { 
      $item = new Item(); 
      $item->setItem($id); 
      $this->item[] = $item; 
      return $item; 
     } 

    } 

    class Item { 

     private $id = array(); 
     private $option = array(); 

     public function setItem($id) { 
      $this->id = $id; 
      return $this; 
     } 

     public function addOption($id) { 
      $option = new Option(); 
      $option->setOption($id); 
      $this->option[] = $option; 
     } 

    } 

    class Option { 

     private $quantity; 
     private $id; 

     public function setOption($id) { 
      $this->quantity = 1; 
      $this->id = $id; 
      return $this; 
     } 

    } 
    $cart = new Cart(); 

    //ItemID 10 
    $item = $cart->addItem(10); 

    //OptionID 
    $item->addOption(11); 
    $item->addOption(22); 
    $item->addOption(22); //should increase quantity 

    //It should not create another object because we already have Item Object of ItemID10 
    $item = $cart->addItem(10); 

    $Shop = $cart; 

    echo "<pre>"; 
    print_r($Shop); 
    echo "</pre>"; 

回答

0

Partialy重写了代码和测试:

<?php 
class Cart { 

     public $items = array(); 

     public function addItem($id) { 
      if(array_key_exists($id, $this->items)){ 
       $item = $this->items[$id]; 
      }else{ 
       $item = new Item($id); 
       $this->items[$id] = &$item; 
      } 
      return $item; 
     } 

    } 

    class Item { 

     private $id; 
     private $options = array(); 

     public function __construct($id) { 
      $this->id = $id; 
      return $this; 
     } 

     public function addOption($id) { 
      if(array_key_exists($id, $this->options)){ 
       $this->options[$id]->addQuantity(); 
      }else{ 
       $option = new Option($id); 
       $this->options[$id] = $option; 
      }   
     } 

    } 

    class Option { 

     private $quantity; 
     private $id; 

     public function __construct($id) { 
      $this->quantity = 1; 
      $this->id = $id; 
      return $this; 
     } 

     public function addQuantity() 
     { 
      $this->quantity++; 
     } 
    } 

    $cart = new Cart(); 

    //ItemID 10 
    $item = $cart->addItem(10); 

    //OptionID 
    $item->addOption(11); 
    $item->addOption(22); 
    $item->addOption(22); //should increase quantity 

    //It should not create another object because we already have Item Object of ItemID10 
    $item = $cart->addItem(10); 

    $Shop = $cart; 

    echo "<pre>"; 
    print_r($Shop); 
    echo "</pre>"; 
?> 
+0

谢谢例如,我已经尝试过,并没有增加数量。虽然没有错误。 –

+0

编辑我的文章:重写您的代码并进行测试。 – Bob

+0

我在此之前发布的文章告诉他如何解决这个问题,但他没有得到它的工作,所以我重写了它。好吧,我真的不在乎-1。我帮助某人,所以我很高兴^^ – Bob

1

如果您可以在车中的唯一的ID只有一个项目 - 然后重写像这样的addItem()方法:

public function addItem($id) { 
     $result = false; 

     if (empty($this->item[$id])) { 
      $item = new Item(); 
      $item->setItem($id); 
      $this->item[$id] = $item; 

      $result = $item; 
     } 

     return $result; 
    } 

同样是与addOption()方法:

public function addOption($id) { 
     if (empty($this->option[$id])) { 
      $option = new Option(); 
      $option->setOption($id); 
      $this->option[$id] = $option; 
     } 
     else { 
      $this->option[$id]->setQuantity($this->option[$id]->getQuantity() + 1); 
     } 
    } 

当然,你应该在Option类中实现setQuantity()和getQuantity()方法。 希望这有助于。