摘要:使用和在中,通过为属性或方法设置和关键字可以实现对属性或方法的可见性控制。你的继承表达了一个对等比如人类是动物的关系,不是包含的关系比如用户具有用户详情你能从基类中复用代码你想通过修改全局类来对所有派生类进行修改。
使用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); } // ... }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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-...
摘要:考虑到函数表示某种行为,函数名称应该是动词或短语,用以说明其背后的意图以及参数的意图。不好的方式好的方式使用条件简写。这可能微不足道,但值得一提。 为了保证可读性,本文采用的音译而非直意。 简介 如果你关注代码本身和代码的编写方式,而不是只关心它是否能工作,那么你写代码是有一定的水准。专业开发人员将为未来的自己和其他人编写代码,而不仅仅只编写当前能工作就行的代码。 在此基础上,简洁代码...
摘要:超过三个参数会导致参数之间的组合过多,你必须对每个单独的参数测试大量不同的情况。拆分这些函数,可以让代码可重用性更高且更易测试。 函数参数不要超过两个 限制函数的参数数量是非常重要的,因为它使你的函数更容易测试。超过三个参数会导致参数之间的组合过多,你必须对每个单独的参数测试大量不同的情况。 没有参数是最理想的情况,一个或两个参数是可以接受的,三个以上则是应该避免的。这很重要的。如果你...
阅读 1093·2021-10-27 14:13
阅读 2622·2021-10-09 09:54
阅读 811·2021-09-30 09:46
阅读 2381·2021-07-30 15:30
阅读 2139·2019-08-30 15:55
阅读 3390·2019-08-30 15:54
阅读 2827·2019-08-29 14:14
阅读 2752·2019-08-29 13:12