класс — Создание системы проверки PHP

Я пытаюсь создать довольно простой Система проверки PHP.

Таблица информации, которую я использую:

Код продукта Название Цена
       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.
}

Любая помощь будет оценена. Также, если кто-нибудь знает, как я могу протестировать этот код, это было бы здорово ☺.

-1

Решение

Я бы создал интерфейс «Скидка», который можно применить к продукту и / или оформлению заказа. Например:

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";
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector