php - 在父类中,我是否应该将类属性设为私有,强制继承者使用 getter/setter?
问题描述
例如,有这样的父母:
class Music {
private $timbre; // This?
protected $timbre; // Or this?
public function getTimbre(){
return $this->timbre;
}
}
在继承的孩子中,从 OO 的角度来看,直接访问成员变量是否可以,或者最好使用 getter/setter?
class PostPunk extends Music {
public function doSomethingTimbreRelated(){
$punk_timbre = $this->getTimbre(); // This?
$punk_timbre = $this->timbre; // Or this?
// ... do something ...
}
}
我读过保持成员变量私有对于封装更好,但这在继承层次结构中真的很重要吗?
而且我意识到这很微不足道,但是我有点前后摇摆不定以两种方式进行,所以我想以一种方式安顿下来
解决方案
经过一番研究,现在我了解到使用 getter/setter 可以通过封装促进与父对象的松散耦合。
在开发人员很少且类简单的小项目中,这样做的好处并不明显。
然而,想象一个具有许多继承类的大型项目,以及消耗 getter/setter 的外部类。
如果以后需要修改或添加一些业务逻辑到 getter 返回的值,则必须重新连接所有继承者以使用 getter VS 直接访问属性。
setter 也是如此 - 也许您决定添加一些数据清理/验证。直接访问属性将绕过这些未来的改进。
类比:你不是让你的孩子自由使用你的钱包/钱包,而是强迫她向你要钱,然后你决定给她什么和多少钱。
推荐阅读
- python - 如何在 PyOpenGL 上创建一个可以对鼠标移动进行“透视旋转”的相机?
- pandas - 什么是 OSError:[Errno 95] Colab 上的 pandas to_csv 不支持操作?
- spring-boot - Spring Security不同版本中SimpleGrantedAuthority问题的序列化和反序列化
- java - 带有 pagerView 的毕加索滑块。获取可绘制的本地图像。以及如何自动更改图像
- python - 如何在模板中获取“price_retail”字段值?
- user-interface - Flutter ListView.builder - 如何以编程方式跳转到某个索引
- php - 用于每天降低数据库值的后台 PHP 脚本
- android - 如何为导航抽屉的每个项目添加框架或分隔符?
- ibm-cloud - 为网站和 Facebook Messenger 创建 Watson Assistant 聊天机器人
- java - 当应用程序在 Android api 28(饼图)中处于前台或后台时,单击通知“启动活动”时的附加信息为 null