1

我是 PHP 新手,每当我阅读良好实践(尤其是与 OOP 相关的)时,我经常会看到诸如“不要将局部变量暴露给全局空间,而是使用 getter 方法或检索方法”之类的语句.

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

如果我的困惑放错了地方,请原谅我。我真的对了解 OOP 最佳实践很感兴趣。

4

5 回答 5

4

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

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

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

function getTotal()
{
    return $privateTotal;
}

或者您可以计算 getter 中的总数:

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

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

于 2013-08-27T10:47:10.380 回答
2

暂时忘记全局名称空间,看看封装信息隐藏的基本概念。在 OOP 中,您使用较小的组件(例如类)构建您的软件。当您将其(脆弱的)内部暴露给外部时,您无法确保该类正常工作。Getter 和 setter 允许您控制对要在类外部公开的变量的访问。

于 2013-08-27T10:24:48.017 回答
1

问题不是为什么要编写无用的 getter/setter 方法,而是为什么要公开变量以混淆类及其方法的主要目的

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

于 2013-08-27T11:20:38.137 回答
0

当您使用方法时,这允许类覆盖该方法。该属性可能在某些类中实现为私有变量,但在其他类中实现为更复杂的计算。如果您直接公开该属性,那么您将在所有实现相同接口的类中都使用它(好吧,不是真的,因为您可以使用魔术方法来伪造它,但这通常只能作为最后的手段)。

于 2013-08-27T10:14:47.090 回答
0

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

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

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

于 2013-08-27T10:14:25.517 回答