创建 PHP 结帐系统

Creating a PHP checkout system

我正在尝试创建一个相当简单PHP结帐系统。

我使用的table信息是:

产品代码 名称 价格
SW1 三明治 £3.11
CL1 巧克力 £5.00
CF1 咖啡 £11.23


我的代码是:

class Product {
    public $name;
    public $price;

    public function __construct($name, $price) {
        $this->item = $name;
        $this->price = $price;
  }
} class Checkout {
    protected $shopping_cart;

    public function scan(Product $product) {
        $shopping_cart[] = $product;
    }

    public function total() {
    // Goes through the shopping cart and sums up the price of the contents
        return array_reduce(
            $this->shopping_cart,
            function($total, $item) {
                return $total + $item->price;
            },
            0
        );
    }
}

$pay = new Checkout();
$pay->scan(new Product("Sandwich", 3.11));
$pay->scan(new Product("Chocolate", 5));
$pay->scan(new Product("Coffee", 11.23));
$price = $pay->total();


我想做的是为某些项目添加定价规则。例如,我希望三明治买一送一,巧克力有批量购买折扣。 不确定它是否有效,但我想我应该添加如下内容:

$SW1 = new Checkout("Sandwich", 3.11);
$CL1 = new Checkout("Chocolate", 5);
$CF1 = new Checkout("Coffee", 11.23);

if(scan($SW1 % 2 == 0)) {
    $price = $price / 2;
}
elseif(scan($SW1 == 1)) {
}
else {
    $price = $price / 2 + $price;
}

if(scan($CL1 >= 3 && $CL1 % 3 == 0)) {
    $price = $price - .50;
}
else {
// insert logic to make sure purchases that include more than 3 items, though not divisible by 3, are also discounted accordingly.
}


任何帮助,将不胜感激。另外,如果有人知道我如何测试这段代码,那就太好了☺。

我会创建一个 'Discount' 界面,可以应用于产品 and/or 结帐。例如:

interface IDiscount {
  public function apply(&$amount);
}

class Discount_HalfOff implements IDiscount {
  public function apply(&$amount) {
    $amount /= 2;
  }
}

class Discount_FixedAmount implements IDiscount {
  private $amount;

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

  public function apply(&$amount) {
    $amount -= $this->amount;
  }
}

class Product {
  private $discounts = [];

  public function __construct($name, $price) {
    $this->item  = $name;
    $this->price = $price;
  }

  public function addDiscount(IDiscount $discount) {
    $this->discounts[] = $discount;
  }

  public function getPrice() {
    $price = $this->price;
    foreach($this->discounts as $discount)
      $discount->apply($price);
    return $price;        
  }
}

class Checkout {
  private $contents  = [];
  private $discounts = [];

  public function addDiscount(IDiscount $discount) {
    $this->discounts[] = $discount;
  }

  public function scan(Product $product) {
    $this->contents[] = $product;
  }

  public function getCount() {
    return count($this->contents);
  }

  public function getTotal() {
    $ttl = 0;
    foreach($this->contents as $product)
      $ttl += $product->getPrice();

    foreach($this->discounts as $discount)
      $discount->apply($ttl);

    return $ttl;
  }
}

$sandwich = new Product('Sandwich', 3.11);
$sandwich->addDiscount(new Discount_HalfOff());

$checkout = new Checkout();
$checkout->scan($sandwich);

// this logic could be included into the Checkout class directly, depends on your use case.
if ($checkout->getCount() > 3) {
  if ($checkout->getCount() % 3 == 0)
    $checkout->addDiscount(new Discount_FixedAmount(0.50));
  } else {
    // insert logic to make sure purchases that include more than 3 items, though not divisible by 3, are also discounted accordingly.
  }
}

echo $checkout->getTotal() . "\n";