PHP Getters / Setters使用或不使用

时间:2014-02-17 01:21:15

标签: php class properties setter getter

我正在通过观看大量的视频教程和阅读过程中的大量文章来学习PHP面向对象的编程。我看到的许多PHP OOP教程都说使用getter和setter。这对我没有意义;为什么我会将类属性设置为私有或受保护,然后使用函数公开公开该属性?我开始研究并在这里找到文章,现在讨厌这个问题:

您是否应该在PHP中使用getter和setter而不是直接访问该类的属性?

如果是,为什么? (非技术术语,请。其他一些问题给出了理由,但它们技术性很强,我无法理解他们试图解释的内容)

如果不是,为什么不呢?

注意:在阅读一些类似的Stack Overflow问题时,我注意到了Google开发人员编写的this post

  

避免写天真的二传手和吸气鬼!在PHP中编写类时,您可以通过直接使用对象属性来节省时间并加快脚本速度,而不是编写天真的setter和getter。在以下示例中,dog类使用setName()和getName()方法来访问name属性。

     

直接设置和调用name属性可以快100%,并缩短开发时间。

Google提供了proof关于使用它们对您的代码产生的速度影响。

2 个答案:

答案 0 :(得分:4)

正如我的近名同名所说,吸气剂和制定者的主要目的是副作用。你总是使用getter和setter的原因是代码可维护性。

假设您拥有10000多行代码项目,并且您已分配到$foo->bar遍布各地。然后突然你决定每次foo的栏改变时都要记录。通过直接访问,您需要浏览整个代码库并查找所有分配。如果你有一个setter,那就是添加一行代码:在分配的地方没有任何变化。

或者,假设您有一个在构造函数中计算的age属性。一段时间后,你认为它不够好;你想在每次需要时计算它。这需要一个功能,直接访问不会削减它。如果从直接访问开始,则需要将其中的每个实例更改为函数调用。如果你从一个简单的getter开始,你可以通过修改getter将return $this->age更改为日期计算或数据库调用或任何你想要的东西:没有其他更改。

Ruby 使成为一个普遍的教条:没有公共属性,只有getter / setter(在Ruby世界中称为访问器),正是因为允许对象的唯一交互是消息传递(除非你使用魔法)。 Ruby也会创建琐碎的getter / setter ......错误,琐碎,这使得它对开发时间的影响可以忽略不计。在PHP中,您可以选择。

答案 1 :(得分:3)

getter / setter的主要目的是当出现“副作用”时。

例如,如果您有一个表示数据库记录的对象,那么您可以为属性编写一个setter,以便在后台更新数据库。在其他语言中,设置窗口的“左”属性(例如您的webbrowser窗口)将移动屏幕上的窗口。

或者,如果计算或检索属性的价格昂贵,则可能不希望在不需要时计算该属性;所以你写了一个计算属性的getter(并缓存结果!)。

其他示例包括过于频繁更改的值,以使其值得获取和存储(例如,多久以前发生的事情),这需要一个getter,或需要验证的地方。

此外,有时2个或更多属性是相互关联的,因此设置一个属性会影响另一个属性。如果你有一个“矩形”对象,并设置“左”位置和“右”位置,你希望能够得到正确的“宽度”;在其他情况下,您可以设置“left”和“width”属性,并且您希望“right”的值正确。要做到这一点,你可能没有“width”属性的实际值,只是一个getter&二传手;所以当你设置它时,它会更新幕后的“右”属性,当你得到它时,它会计算“左”和“右”属性的值。