摘要:使用和在中,通過為屬性或方法設置和關鍵字可以實現對屬性或方法的可見性控制。你的繼承表達了一個對等比如人類是動物的關系,不是包含的關系比如用戶具有用戶詳情你能從基類中復用代碼你想通過修改全局類來對所有派生類進行修改。
使用getter和setter
在 PHP 中,通過為屬性或方法設置 public, protected 和 private 關鍵字可以實現對屬性或方法的可見性控制。不過,通過 getter 和 setter 也可以達到控制可見性的目的,并且在某些場景下它具備一些額外的好處。
使用 getter和 setter 有以下好處:
當你除了獲取對象之外還想做一些別的事情時,就不用到項目中去查找所有的屬性并修改
使添加驗證更簡單
在獲取和設置時添加日志和錯誤處理更方便
我們可以延遲加載類的屬性
繼承了類,你可以重寫默認的函數
另外,這是面向對象的基本設計原則中的開放/封閉原則。
Bad:
class BankAccount { public $balance = 1000; } $bankAccount = new BankAccount(); // 買了一雙鞋... $bankAccount->balance -= 100;
Good:
class BankAccount { private $balance; public function __construct($balance = 1000) { $this->balance = $balance; } //做一些事情 public function withdrawBalance($amount) { if ($amount > $this->balance) { throw new Exception("Amount greater than available balance."); } $this->balance -= $amount; } public function depositBalance($amount) { $this->balance += $amount; } public function getBalance() { return $this->balance; } } $bankAccount = new BankAccount(); // 買了一雙鞋... $bankAccount->withdrawBalance($shoesPrice); // 獲取結余 $balance = $bankAccount->getBalance();讓對象具有私有或受保護的的成員
Bad:
class Employee { public $name; public function __construct($name) { $this->name = $name; } } $employee = new Employee("John Doe"); echo "Employee name: ".$employee->name; // Employee name: John Doe
Good:
class Employee { private $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } $employee = new Employee("John Doe"); echo "Employee name: ".$employee->getName(); // Employee name: John Doe使用組合而不是繼承
這里不是說不使用繼承,使用“組合模式”和使用“繼承”都有很多好的理由。
這里想說的是當你本能的要使用繼承時就想一想“組合模式”是否能更好幫你的解決問題。
那么,你可能想知道,“什么時候應該用繼承?”, 這取決于你手頭上問題。
以下幾點說明了什么時候使用繼承會更合適。
你的繼承表達了一個對等(比如"人類是動物")的關系,不是包含的關系(比如"用戶具有用戶詳情")
你能從基類中復用代碼
你想通過修改全局類來對所有派生類進行修改。
Bad:
class Employee { private $name; private $email; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } // ... } // 因為雇員和稅收不是對等關系而是包含的關系 // 所以這里應用組合比較合適 class EmployeeTaxData extends Employee { private $ssn; private $salary; public function __construct($name, $email, $ssn, $salary) { parent::__construct($name, $email); $this->ssn = $ssn; $this->salary = $salary; } // ... }
Good:
class EmployeeTaxData { private $ssn; private $salary; public function __construct($ssn, $salary) { $this->ssn = $ssn; $this->salary = $salary; } // ... } class Employee { private $name; private $email; private $taxData; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } public function setTaxData($ssn, $salary) { $this->taxData = new EmployeeTaxData($ssn, $salary); } // ... }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25944.html
摘要:是推薦的便于記憶的首字母簡寫,它代表了命名的最重要的五個面對對象編碼設計原則單一職責原則開閉原則里氏替換原則接口隔離原則依賴反轉原則單一職責原則修改一個類應該只為一個理由。別寫重復代碼這條原則大家應該都是比較熟悉了。 SOLID 是Michael Feathers推薦的便于記憶的首字母簡寫,它代表了Robert Martin命名的最重要的五個面對對象編碼設計原則 S: 單一職責原則 ...
摘要:日期和時間使用類完成讀取設置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發周期的一種用于保證函數類和方法的行為與預期一致的編程方法。是應用的單元測試框架的業界標準,其他幾個可選框架是行為驅動開發行為驅動開發有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:將代碼寫的簡潔并且易讀易懂是每一位優秀的所應該具備的基本功。前幾天在上看到這個項目,感覺很有收獲,于是在這里記錄一下。 將代碼寫的簡潔并且易讀易懂是每一位優秀的coder所應該具備的基本功。 前幾天在github上看到clean-code-php這個項目,感覺很有收獲,于是在這里記錄一下。 使用有意義并且可讀的變量名稱 Bad: $ymdstr = $moment->format(y-...
摘要:考慮到函數表示某種行為,函數名稱應該是動詞或短語,用以說明其背后的意圖以及參數的意圖。不好的方式好的方式使用條件簡寫。這可能微不足道,但值得一提。 為了保證可讀性,本文采用的音譯而非直意。 簡介 如果你關注代碼本身和代碼的編寫方式,而不是只關心它是否能工作,那么你寫代碼是有一定的水準。專業開發人員將為未來的自己和其他人編寫代碼,而不僅僅只編寫當前能工作就行的代碼。 在此基礎上,簡潔代碼...
摘要:超過三個參數會導致參數之間的組合過多,你必須對每個單獨的參數測試大量不同的情況。拆分這些函數,可以讓代碼可重用性更高且更易測試。 函數參數不要超過兩個 限制函數的參數數量是非常重要的,因為它使你的函數更容易測試。超過三個參數會導致參數之間的組合過多,你必須對每個單獨的參數測試大量不同的情況。 沒有參數是最理想的情況,一個或兩個參數是可以接受的,三個以上則是應該避免的。這很重要的。如果你...
閱讀 1129·2021-10-27 14:13
閱讀 2636·2021-10-09 09:54
閱讀 897·2021-09-30 09:46
閱讀 2424·2021-07-30 15:30
閱讀 2166·2019-08-30 15:55
閱讀 3409·2019-08-30 15:54
閱讀 2847·2019-08-29 14:14
閱讀 2771·2019-08-29 13:12