面向對象編程的基本原則: 1、設置類的屬性 用以上方法設置屬性值會有很多問題: 第一:PHP允許動態設置屬性,如果拼錯或忘記屬性名時並不會得到警告。例如錯誤地把 寫作 ,當我們輸出作者名字的時候,會有意想不到的結果。 第二:類太過鬆散,我們沒有強制設置標題、價格或者產品名稱,客戶端代碼可以確定的是
面向對象編程的基本原則:
- 單一職責:一個類,只需要做好一件事
- 開放封閉:一個類,應該是可擴展的,而不是可修改的
- 依賴倒置:一個類,不應該強依賴另一個類。每個類對應另外一個類都是可替換的
- 配置化:儘可能地使用配置,而不是硬編碼
- 面向介面編程:只需要關心介面,不需要關心實現
1、設置類的屬性
class ShopProduct { public $title = 'default product'; public $producterMainName = 'main name'; public $producterFirstName = 'first name'; public $price = 0; } $product1 = new ShopProduct(); //設置屬性 $product1->title = "My Antonia"; $product1->producterFirstName = "Cather"; $product1->producterMainName = "Willa"; $product1->price = 5.99; //訪問 echo 'author: '.$product1->producterFirstName.' '.$product1->producterMainName;
用以上方法設置屬性值會有很多問題:
第一:PHP允許動態設置屬性,如果拼錯或忘記屬性名時並不會得到警告。例如錯誤地把
$product1->producterMainName = "Willa";
寫作
$product1->producterSecondName = "Willa";
,當我們輸出作者名字的時候,會有意想不到的結果。
第二:類太過鬆散,我們沒有強制設置標題、價格或者產品名稱,客戶端代碼可以確定的是這些屬性存在,但是面對的可能是預設值也可能不是,理想情況下,我們希望實例化ShopProduct對象時設置有意義的屬性值。
第三:不得不重覆做一些經常做的事,比如多次需要完整輸出作者的名字,就要重覆使用
echo 'author: '.$product1->producterFirstName.' '.$product1->producterMainName;
改進後的:
2、使用方法
class ShopProduct { public $title; public $producterMainName; public $producterFirstName; public $price = 0;
//設置預設值,$this偽變數把類指向一個對象實例,$this可以理解為當前實例 public function __construct($title, $producterMainName, $producterFirstName, $price){ $this->title = $title; $this->producterMainName = $producterMainName; $this->producterFirstName = $producterFirstName; $this->price = $price; } //獲取作者名 public function getProducter(){ return $this->producterFirstName.' '.$this->producterMainName; } } $product1 = new ShopProduct('My Antonia', 'Willa', 'Cather', 5.99); //訪問 echo 'author: '.$product1->getProducter();