Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象PHP中的封装-何时真正需要它?_Php_Oop_Encapsulation - Fatal编程技术网

面向对象PHP中的封装-何时真正需要它?

面向对象PHP中的封装-何时真正需要它?,php,oop,encapsulation,Php,Oop,Encapsulation,我知道这是一个关于信仰的问题,以前也被问过很多次,但我发现的答案要么太笼统,要么不适用于我的用例,要么不满足于其他方面 我目前正在构建一个应用程序,它使用类作为数据库表的表示形式。这些类不提供任何自己的方法,我为每个类编写了一个解析器类,用于处理它们的对象,并以我需要的格式返回数据,这使得父类只不过是数据存储,并且很好地区分了数据和逻辑 现在,OOP中的共识似乎是您必须始终使用getter和setter,而不是直接访问类属性 我经常听到的一个论点是,使用getter和setter可以在以后扩展这

我知道这是一个关于信仰的问题,以前也被问过很多次,但我发现的答案要么太笼统,要么不适用于我的用例,要么不满足于其他方面

我目前正在构建一个应用程序,它使用类作为数据库表的表示形式。这些类不提供任何自己的方法,我为每个类编写了一个解析器类,用于处理它们的对象,并以我需要的格式返回数据,这使得父类只不过是数据存储,并且很好地区分了数据和逻辑

现在,OOP中的共识似乎是您必须始终使用getter和setter,而不是直接访问类属性

我经常听到的一个论点是,使用getter和setter可以在以后扩展这些函数,但在我看来,这与YAGNI和其他一些我现在记不起名称的概念背道而驰,即一个方法应该完全按照您对其名称的期望来做。如果我想做的不仅仅是简单地设置一个值,我会编写一个新方法,而不是将其放入我的setter方法中,因为根据定义,该方法只应该设置属性。因此,我不妨跳过setter,直接访问属性

另一个是可以在setter中进行验证,我已经在访问这些类的API中进行了验证。在我看来,你不应该只是传递值,让对象告诉你你的值是否正确,而是在你传递给对象之前先验证这些值


我确实理解“普通”类中私有/受保护属性的用途,但是当该类实际上只是一个没有任何方法的数据容器时,真的需要这样做吗?换句话说:使用公共值是否有一个明显的缺点,当这些值的setter方法(如果它们是私有的)看起来都像
公共函数getAttr($attr){$this->atr=$attr;}
无论如何?

您只需要一个数据结构,但唯一合适的PHP构造是类

通常,在面向对象的分析、设计和编程中,类是事物或概念的模型,它封装了事物或概念的任何知识和/或行为


但是,在这个问题的上下文中,不需要封装,因为您只需要数据结构。

您是唯一维护代码的人吗?其他人是否可能将预期为
DateTime
对象的属性(例如)设置为日期字符串或类似的属性?但最终,这个问题可能会以“主要基于观点”来结束,因为唯一可能的准确答案是“这取决于……”“面向对象的封装——什么时候真的需要?”——这是面向对象代码的基本属性之一。没有封装,就没有OOP,只有过程编程。当对象属性有setter和getter时,它是伪装成OOP的过程代码。“但是当类实际上只是一个没有任何方法的数据容器”那么为什么它仍然是php类?@bxN5,因为我使用的ORM要求数据库表有相应的类。类是属性和行为的组合。由于您的类没有行为,只有属性,因此最终会将过程代码包装在一个类中,并朝这个方向发展。