面向对象PHP中的封装 - 什么时候真的需要?

时间:2018-02-22 09:28:20

标签: php oop encapsulation

我知道这是一个信仰问题,之前已被多次询问,但我发现的答案要么太一般,不适用于我的用例,或者不满意。< / p>

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

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

我经常听到的一个论点是,使用getter和setter可以在以后扩展这些函数,但在我看来,这违背了YAGNI以及其他一些我现在不记得名字的概念 - 那个一个方法应该完全按照你的名字做。如果我想做的不仅仅是设置一个值,我会写一个新的方法,而不是把它放到我的setter方法中,因为根据定义,它只应该设置属性。所以我不妨跳过setter并直接访问该属性。

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

我确实理解“通常”类中私有/受保护属性的用途,但是当这个类实际上只是一个没有任何方法的数据容器时,这真的需要吗?换句话说:使用公共值有一个明显的缺点,那些用于那些(他们是私有的)的setter方法总是看起来像public function getAttr($attr) { $this->atrr = $attr; }吗?

1 个答案:

答案 0 :(得分:1)

您需要的是数据结构。只是在您实现它的语言中,您必须使用类构造。在这种情况下,不要为封装烦恼。

如果你研究面向对象的分析/设计/编程,你会发现一个类不仅仅是数据和方法的容器。它是一个事物或概念的模型,如果那个事物或概念具有知识和行为,那么那些需要被封装。

在您的特定情况下,您正在建模数据结构,因此实际上不需要封装任何内容。