PHP面向對象之旅:一個接口實例

一個很好的接口學習例子
服務器君一共花費了158.357 ms進行了5次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

我們設計一個在線銷售系統,用戶部分設計如下:

將用戶分為,NormalUser, VipUser, InnerUser三種。

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

并要求為以后擴展和維護預留空間。

用戶部分先聲明了一個接口User,用戶都是User的實現。

User.php

<?
/*
* 定義了 User接口.
* 和子類 NormalUser,VipUser,InnerUser 
*/
//User接口,定義了三個抽象方法.
interface User{
	public function getName();
	public function setName($_name);
	public function getDiscount();
}
abstract class AbstractUser implements User{
	private $name = ""; //名字
	protected  $discount = 0; //折扣
	protected  $grade = "";  //級別
	
	public function __construct($_name){
		$this->setName($_name);
	}
	public function getName(){
		return $this->name;
	}
	public function setName($_name){
		$this->name = $_name;
	}
	public function getDiscount(){
		return $this->discount;
	}
	
	public function getGrade(){
		return $this->grade;
	}
}
class NormalUser extends AbstractUser  {	
	protected  $discount = 1.0;
	protected  $grade = "NormalUser";
}
class VipUser extends AbstractUser {
	protected  $discount = 0.8;
	protected  $grade = "VipUser";
}
class InnerUser extends AbstractUser {
	protected  $discount = 0.7;
	protected  $grade = "InnerUser";
}
?>

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

聲明一個接口Product,然后從Product繼承下Book接口。

在線銷售的圖書最后是實現了Book接口的BookOnline類。

Product.php

<?
/*與產品相關的類放.*/
Interface Product{ //定義產品接口
	public function getProductName();
	public function getProductPrice();
}
interface Book extends Product { // book是產品的一個分類
	public function getAuthor();
}
class BookOnline implements Book{ // 定義book類.
	private $productName;  // 產品名
	private $productPrice; // 產品價格
	private $author;  //作者
	
	public function __construct($_bookName){
		$this->productName = $_bookName;
		//這里放置相關初始化的代碼.
		//與數據庫關聯的代碼.
	}
	
	public function getProductName(){
		return $this->productName;
	}
	
	public function getProductPrice(){
		//這里從數據庫讀取價格.
		//假設價格是 100元.
		$this->productPrice = 100;
		return $this->productPrice;
	}
	
	public function getAuthor(){
		//從數據庫里面取值.
		return $this->author;
	}	
}
?>

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

ProductSettle.php

<?
include_once("User.php");
include_once("Product.php");
//買了產品到底多少錢呢?
class ProductSettle{
	public static function  finalPrice(User $_user,Product $_product,$number = 1){
		$price = $_user->getDiscount() * $_product->getProductPrice() * $number;
		return $price;
	}
}
?>

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

<?
include_once("./class/User.php");
include_once("./class/Product.php");
include_once("./class/ProductSettle.php");
$number = 10;
$book = new BookOnline("設計模式");
$user = new NormalUser("Tom");
$price = ProductSettle::finalPrice($user,$book,$number);
$str =  "您好,尊敬的用戶 " . $user->getName() . " <br>";
$str .= "您的級別是 ". $user->getGrade() .", <br>";
$str .= "您的折扣是 " . $user->getDiscount() . "<br>";
$str .= "購買 $number 本 《 ". $book->getProductName() ;
$str .=  "》的價格是 $price <br><br>";
echo $str;
$user = new vipUser("Tom");
$price = ProductSettle::finalPrice($user,$book,$number);
$str =  "您好,尊敬的用戶 " . $user->getName() . " <br>";
$str .= "您的級別是 ". $user->getGrade() .", <br>";
$str .= "您的折扣是 " . $user->getDiscount() . "<br>";
$str .= "購買 $number 本 《 ". $book->getProductName() ;
$str .=  "》的價格是 $price <br><br>";
echo $str;
$user = new InnerUser("Tom");
$price = ProductSettle::finalPrice($user,$book,$number);
$str =  "您好,尊敬的用戶 " . $user->getName() . " <br>";
$str .= "您的級別是 ". $user->getGrade() .", <br>";
$str .= "您的折扣是 " . $user->getDiscount() . "<br>";
$str .= "購買 $number 本 《 ". $book->getProductName() ;
$str .=  "》的價格是 $price <br><br>";
echo $str;
?>

延伸閱讀

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

  1. PHP面向對象之旅:類和對象
  2. PHP面向對象之旅:類的屬性
  3. PHP面向對象之旅:類的方法
  4. PHP面向對象之旅:對象的比較
  5. PHP面向對象之旅:構造函數
  6. PHP面向對象之旅:類的繼承
  7. PHP面向對象之旅:訪問控制
  8. PHP面向對象之旅:方法覆蓋
  9. PHP面向對象之旅:this關鍵字
  10. PHP面向對象之旅:parent::關鍵字
  11. PHP面向對象之旅:再談重載
  12. PHP面向對象之旅:獲取用戶數據
  13. PHP面向對象之旅:用戶權限管理類
  14. PHP面向對象之旅:static變量與方法
  15. PHP面向對象之旅:單例模式
  16. PHP面向對象之旅:final類和方法
  17. PHP面向對象之旅:PHP中的常量
  18. PHP面向對象之旅:抽象類
  19. PHP面向對象之旅:抽象方法
  20. PHP面向對象之旅:抽象類繼承抽象類
  21. PHP面向對象之旅:靜態抽象方法
  22. PHP面向對象之旅:模板模式
  23. PHP面向對象之旅:接口與抽象方法
  24. PHP面向對象之旅:接口的實現
  25. PHP面向對象之旅:接口的繼承
  26. PHP面向對象之旅:類型提示
  27. PHP面向對象之旅:PHP的多態
  28. PHP面向對象之旅:instanceof運算符
  29. PHP面向對象之旅:接口與組合模擬多繼承
  30. PHP面向對象之旅:一個接口實例
  31. PHP面向對象之旅:簡單工廠模式

本文地址:http://www.zqhthc.tw/librarys/veda/detail/1111,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.zqhthc.tw/librarys/veda/detail/1111

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《代碼大全(第2版)》 史蒂夫?邁克康奈爾 (Steve McConnell) (作者), 金戈 (譯者)

代碼大全(第2版)是著名IT暢銷書作者、《IEEE Software》雜志前主編、具有20年編程與項目管理經驗的Steve McConnell十余年前的經典著作的全新演繹:第2版做了全面的更新,增加了很多與時俱進的內容,包括對新語言、新的開發過程與方法論的討論等等。這是一本百科全書式的軟件構建手冊,涵蓋了軟件構建活動的方方面面,尤其強調提高軟件質量的種種實踐方法。

更多計算機寶庫...

英超直播吻球网