2017-08-14 72 views
-1

我试图创建一个相当简单的 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. 
} 


任何帮助,将不胜感激。另外如果有人知道我如何测试这段代码,那会很棒。

+2

试图建立自己的电子商务系统,如果你打算在生产中使用它可能是一个非常糟糕的主意。你最好扩展现有的系统。 此外,您应该至少编写代码,然后在遇到困难时寻求帮助,而不是要求人们为您编写代码。 – Difster

回答

0

我会创建一个可以应用于产品和/或结帐的“折扣”界面。例如:

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

非常感谢你!我觉得我很了解这一点。只是想知道是否可以结账的东西是这样的:$ checkout-> scan($ sandwich,$ chocolate);或者它必须更​​像$ checkout-> scan($ sandwich); $ checkout->扫描($巧克力);谢谢! – Developer

+0

这肯定是可能的,有两种方法......要么传递一个产品数组来扫描,要么使用'func_get_args'来检索传递给方法的参数列表。 – Geoffrey