查看: 1608|回复: 0

[PHP实例] PHP代码简洁之道——类和对象部分

发表于 2017-10-13 08:00:03
句号论坛
使用getter和setter

在 PHP 中,通过为属性或方法设置 public, protected 和 private 关键字可以实现对属性或方法的可见性控制。不过,通过 getter 和 setter 也可以达到控制可见性的目的,并且在某些场景下它具备一些额外的好处。

使用 getter和 setter 有以下好处:

当你除了获取对象之外还想做一些别的事情时,就不用到项目中去查找所有的属性并修改 使添加验证更简单 在获取和设置时添加日志和错误处理更方便 我们可以延迟加载类的属性 继承了类,你可以重写默认的函数

另外,这是面向对象的基本设计原则中的开放/封闭原则。

Bad:

  1. class BankAccount
  2. {
  3. public $balance = 1000;
  4. }
  5. $bankAccount = new BankAccount();
  6. // 买了一双鞋...
  7. $bankAccount->balance -= 100;
复制代码

Good:

  1. class BankAccount
  2. {
  3. private $balance;
  4. public function __construct($balance = 1000)
  5. {
  6. $this->balance = $balance;
  7. }
  8. //做一些事情
  9. public function withdrawBalance($amount)
  10. {
  11. if ($amount > $this->balance) {
  12. throw new \Exception('Amount greater than available balance.');
  13. }
  14. $this->balance -= $amount;
  15. }
  16. public function depositBalance($amount)
  17. {
  18. $this->balance += $amount;
  19. }
  20. public function getBalance()
  21. {
  22. return $this->balance;
  23. }
  24. }
  25. $bankAccount = new BankAccount();
  26. // 买了一双鞋...
  27. $bankAccount->withdrawBalance($shoesPrice);
  28. // 获取结余
  29. $balance = $bankAccount->getBalance();
复制代码
让对象具有私有或受保护的的成员

Bad:

  1. class Employee
  2. {
  3. public $name;
  4. public function __construct($name)
  5. {
  6. $this->name = $name;
  7. }
  8. }
  9. $employee = new Employee('John Doe');
  10. echo 'Employee name: '.$employee->name; // Employee name: John Doe
复制代码

Good:

  1. class Employee
  2. {
  3. private $name;
  4. public function __construct($name)
  5. {
  6. $this->name = $name;
  7. }
  8. public function getName()
  9. {
  10. return $this->name;
  11. }
  12. }
  13. $employee = new Employee('John Doe');
  14. echo 'Employee name: '.$employee->getName(); // Employee name: John Doe
复制代码
使用组合而不是继承

这里不是说不使用继承,使用“组合模式”和使用“继承”都有很多好的理由。

这里想说的是当你本能的要使用继承时就想一想“组合模式”是否能更好帮你的解决问题。

那么,你可能想知道,“什么时候应该用继承?”, 这取决于你手头上问题。

以下几点说明了什么时候使用继承会更合适。

你的继承表达了一个对等(比如"人类是动物")的关系,不是包含的关系(比如"用户具有用户详情") 你能从基类中复用代码 你想通过修改全局类来对所有派生类进行修改。

Bad:

  1. class Employee
  2. {
  3. private $name;
  4. private $email;
  5. public function __construct($name, $email)
  6. {
  7. $this->name = $name;
  8. $this->email = $email;
  9. }
  10. // ...
  11. }
  12. // 因为雇员和税收不是对等关系而是包含的关系
  13. // 所以这里应用组合比较合适
  14. class EmployeeTaxData extends Employee
  15. {
  16. private $ssn;
  17. private $salary;
  18. public function __construct($name, $email, $ssn, $salary)
  19. {
  20. parent::__construct($name, $email);
  21. $this->ssn = $ssn;
  22. $this->salary = $salary;
  23. }
  24. // ...
  25. }
复制代码

Good:

  1. class EmployeeTaxData
  2. {
  3. private $ssn;
  4. private $salary;
  5. public function __construct($ssn, $salary)
  6. {
  7. $this->ssn = $ssn;
  8. $this->salary = $salary;
  9. }
  10. // ...
  11. }
  12. class Employee
  13. {
  14. private $name;
  15. private $email;
  16. private $taxData;
  17. public function __construct($name, $email)
  18. {
  19. $this->name = $name;
  20. $this->email = $email;
  21. }
  22. public function setTaxData($ssn, $salary)
  23. {
  24. $this->taxData = new EmployeeTaxData($ssn, $salary);
  25. }
  26. // ...
  27. }
复制代码


太阳http代理AD
回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条