1. 程式人生 > >PHP面向物件之旅:一個介面例項,很好的例子

PHP面向物件之旅:一個介面例項,很好的例子

我們設計一個線上銷售系統,使用者部分設計如下:

將使用者分為,NormalUser, VipUser, InnerUser三種。

要求根據使用者的不同折扣計算使用者購買產品的價格。

並要求為以後擴充套件和維護預留空間。

使用者部分先聲明瞭一個介面User,使用者都是User的實現。

User.php

01 <?
02 /*
03 * 定義了 User介面.
04 * 和子類 NormalUser,VipUser,InnerUser
05 */
06 //User介面,定義了三個抽象方法.
07 interface User{
08 publicfunction getName();
09 publicfunction setName($_name);
10 publicfunction getDiscount();
11 }
12 abstract classAbstractUser implements User{
13 private$name = "";//名字
14 protected $discount = 0; //折扣
15 protected $grade = ""//級別
16
17 publicfunction __construct($_name){
18 $this->setName($_name);
19 }
20 publicfunction getName(){
21 return$this->name;
22 }
23 publicfunction setName($_name){
24 $this->name =$_name;
25 }
26 publicfunction getDiscount(){
27 return$this->discount;
28 }
29
30 publicfunction getGrade(){
31 return$this->grade;
32 }
33 }
34 class
NormalUserextends AbstractUser  {   
35 protected $discount = 1.0;
36 protected $grade = "NormalUser";
37 }
38 class VipUserextends AbstractUser {
39 protected $discount = 0.8;
40 protected $grade = "VipUser";
41 }
42 class InnerUserextends AbstractUser {
43 protected $discount = 0.7;
44 protected $grade = "InnerUser";
45 }
46 ?>

關於產品,我們進行了如下設計。

宣告一個介面Product,然後從Product繼承下Book介面。

線上銷售的圖書最後是實現了Book介面的BookOnline類。

Product.php

01 <?
02 /*與產品相關的類放.*/
03 Interface Product{ //定義產品介面
04 publicfunction getProductName();
05 publicfunction getProductPrice();
06 }
07 interface Bookextends Product { // book是產品的一個分類
08 publicfunction getAuthor();
09 }
10 class BookOnlineimplements Book{ // 定義book類.
11 private$productName// 產品名
12 private$productPrice; // 產品價格
13 private$author//作者
14
15 publicfunction __construct($_bookName){
16 $this->productName =$_bookName;
17 //這裡放置相關初始化的程式碼.
18 //與資料庫關聯的程式碼.
19 }
20
21 publicfunction getProductName(){
22 return$this->productName;
23 }
24
25 publicfunction getProductPrice(){
26 //這裡從資料庫讀取價格.
27 //假設價格是 100元.
28 $this->productPrice = 100;
29 return$this->productPrice;
30 }
31
32 publicfunction getAuthor(){
33 //從資料庫裡面取值.
34 return$this->author;
35 }  
36 }
37 ?>

關於結算,我們使用了獨立的結算類,使用靜態方法做計算。產品結算。注意引數型別。

ProductSettle.php

01 <?
02 include_once("User.php");
03 include_once("Product.php");
04 //買了產品到底多少錢呢?
05 class ProductSettle{
06 publicstatic function  finalPrice(User $_user,Product$_product,$number= 1){
07 $price= $_user->getDiscount() *$_product->getProductPrice() *$number;
08 return$price;
09 }
10 }
11 ?>

下面的例子是實現。大家可以自己分析下。

01 <?
02 include_once("./class/User.php");
03 include_once("./class/Product.php");
04 include_once("./class/ProductSettle.php");
05 $number = 10;
06 $book = new BookOnline("設計模式");
07 $user = new NormalUser("Tom");
08 $price = ProductSettle::finalPrice($user,$book,$number);
09 $str "您好,尊敬的使用者 " . $user->getName() ." <br>";
10 $str .= "您的級別是 ". $user->getGrade() .", <br>";
11 $str .= "您的折扣是 " . $user->getDiscount() ."<br>";
12 $str .= "購買 $number 本 《 ". $book->getProductName() ;
13 $str .=  "》的價格是 $price <br><br>";
14 echo $str;
15 $user = new vipUser("Tom");
16 $price = ProductSettle::finalPrice($user,$book,$number);
17 $str "您好,尊敬的使用者 " . $user->getName() ." <br>";
18 $str .= "您的級別是 ". $user->getGrade() .", <br>";
19 $str .= "您的折扣是 " . $user->getDiscount() ."<br>";
20 $str .= "購買 $number 本 《 ". $book->getProductName() ;
21 $str .=  "》的價格是 $price <br><br>";
22 echo $str;
23 $user = new InnerUser("Tom");
24 $price = ProductSettle::finalPrice($user,$book,$number);
25 $str "您好,尊敬的使用者 " . $user->getName() ." <br>";
26 $str .= "您的級別是 ". $user->getGrade() .", <br>";
27 $str .= "您的折扣是 " . $user->getDiscount() ."<br>";
28 $str .= "購買 $number 本 《 ". $book->getProductName() ;
29 $str .=  "》的價格是 $price <br><br>";
30 echo $str;
31 ?>

延伸閱讀

此文章所在專題列表如下: