为什么不能访问类的属性,但可以访问同一个类的方法?

时间:2013-08-27 10:04:40

标签: php oop

我是PHP的新手,每当我阅读好的做法,尤其是与OOP有关的好习惯时,我经常会看到诸如“不要将局部变量暴露给全局空间,使用getter方法或检索”之类的语句方法改为“。

我理解为什么我们不想污染全局命名空间,但在什么时候调用getter方法只是为了访问一个简单的属性变得简单荒谬?我认为这显示出巨大的虚伪。我们愿意在类定义之外公开和调用方法,但不是简单的变量?为什么是这样?这种方法不是更复杂吗?

如果我的混淆错位,请原谅我。我真的很想了解OOP最佳实践。

5 个答案:

答案 0 :(得分:4)

使用getter和setter访问对象属性始终是最佳做法,因为他们隐藏有关如何存储和获取特定值的信息

基本上,您提供接口(不会更改)以通过隐藏逻辑访问信息(可能会更改)。

一个愚蠢的例子可能是getTotal方法,它返回一个计算值。你可以有一个像这样的简单的getter,它只返回先前计算的总数:

function getTotal()
{
    return $privateTotal;
}

或者你可以计算你的吸气剂内的总数:

function getTotal()
{
    return $sub1 + $sub2 + $sub3;
}

您可以随时更改实施。客户端不会意识到逻辑的变化。

答案 1 :(得分:2)

暂时忘记全局命名空间,并查看encapsulationinformation hiding的基本概念。 在OOP中,您可以使用较小的组件(例如类)构建软件。当您将(脆弱的)内部暴露给外部时,您无法确保类正常工作。 Getters和setter允许您控制对要向类外部公开的变量的访问。

答案 2 :(得分:1)

问题不在于为什么要编写无用的getter / setter方法为什么要公开变量来混淆类及其方法的主要目的?< / p>

考虑变量只能有getter,只有setter或者两者都没有。

答案 3 :(得分:0)

这被称为封装。通常,局部变量是实现细节。这不应该暴露,因为调用代码(如果它被正确解耦)只关心 你不 你做什么。

如果您的实现更改,可能会删除或更改变量,这意味着需要更改调用代码。方法摘要并允许内部更改而不影响公开的接口。

另一个原因是直接访问变量允许调用代码来改变类所依赖的变量。方法允许创建数组的副本,以便更改数组的代码不会影响类的逻辑。

答案 4 :(得分:0)

使用方法时,这允许类覆盖该方法。该属性可能在某些类中实现为私有变量,但在其他类中则更复杂。如果你直接公开属性,你就会在实现相同接口的所有类中坚持使用它(好吧,不是真的,因为你可以用魔术方法伪造它,但这通常只能作为最后的手段使用)。 / p>