我是PHP的新手,每当我阅读好的做法,尤其是与OOP有关的好习惯时,我经常会看到诸如“不要将局部变量暴露给全局空间,使用getter方法或检索”之类的语句方法改为“。
我理解为什么我们不想污染全局命名空间,但在什么时候调用getter方法只是为了访问一个简单的属性变得简单荒谬?我认为这显示出巨大的虚伪。我们愿意在类定义之外公开和调用方法,但不是简单的变量?为什么是这样?这种方法不是更复杂吗?
如果我的混淆错位,请原谅我。我真的很想了解OOP最佳实践。
答案 0 :(得分:4)
使用getter和setter访问对象属性始终是最佳做法,因为他们隐藏有关如何存储和获取特定值的信息。
基本上,您提供接口(不会更改)以通过隐藏逻辑访问信息(可能会更改)。
一个愚蠢的例子可能是getTotal
方法,它返回一个计算值。你可以有一个像这样的简单的getter,它只返回先前计算的总数:
function getTotal()
{
return $privateTotal;
}
或者你可以计算你的吸气剂内的总数:
function getTotal()
{
return $sub1 + $sub2 + $sub3;
}
您可以随时更改实施。客户端不会意识到逻辑的变化。
答案 1 :(得分:2)
暂时忘记全局命名空间,并查看encapsulation和information hiding的基本概念。 在OOP中,您可以使用较小的组件(例如类)构建软件。当您将(脆弱的)内部暴露给外部时,您无法确保类正常工作。 Getters和setter允许您控制对要向类外部公开的变量的访问。
答案 2 :(得分:1)
问题不在于为什么要编写无用的getter / setter方法但为什么要公开变量来混淆类及其方法的主要目的?< / p>
考虑变量只能有getter,只有setter或者两者都没有。
答案 3 :(得分:0)
这被称为封装。通常,局部变量是实现细节。这不应该暴露,因为调用代码(如果它被正确解耦)只关心 你不 你做什么。
如果您的实现更改,可能会删除或更改变量,这意味着需要更改调用代码。方法摘要并允许内部更改而不影响公开的接口。
另一个原因是直接访问变量允许调用代码来改变类所依赖的变量。方法允许创建数组的副本,以便更改数组的代码不会影响类的逻辑。
答案 4 :(得分:0)
使用方法时,这允许类覆盖该方法。该属性可能在某些类中实现为私有变量,但在其他类中则更复杂。如果你直接公开属性,你就会在实现相同接口的所有类中坚持使用它(好吧,不是真的,因为你可以用魔术方法伪造它,但这通常只能作为最后的手段使用)。 / p>