我是 PHP 新手,每当我阅读良好实践(尤其是与 OOP 相关的)时,我经常会看到诸如“不要将局部变量暴露给全局空间,而是使用 getter 方法或检索方法”之类的语句.
我理解为什么我们不想污染全局命名空间,但是在什么时候调用 getter 方法只是为了访问一个简单的属性变得非常荒谬?我认为这表明了巨大的虚伪。我们愿意在类定义之外公开和调用方法,但不是简单的变量?为什么是这样?方法不是更复杂吗?
如果我的困惑放错了地方,请原谅我。我真的对了解 OOP 最佳实践很感兴趣。
使用 getter 和 setter 访问对象属性始终是最佳实践,因为它们隐藏了有关您如何存储和获取特定值的信息。
基本上,您提供了一个接口(不会更改)以通过隐藏的逻辑(可能会更改)访问信息。
一个愚蠢的例子可能是getTotal
返回计算值的方法。你可以有一个像这样的简单 getter,它只返回先前计算的总数:
function getTotal()
{
return $privateTotal;
}
或者您可以计算 getter 中的总数:
function getTotal()
{
return $sub1 + $sub2 + $sub3;
}
您可以随时更改实施。客户不会意识到你的逻辑变化。
问题不是为什么要编写无用的 getter/setter 方法,而是为什么要公开变量以混淆类及其方法的主要目的?
考虑变量只能有 getter、只有 setter 或两者都没有。
当您使用方法时,这允许类覆盖该方法。该属性可能在某些类中实现为私有变量,但在其他类中实现为更复杂的计算。如果您直接公开该属性,那么您将在所有实现相同接口的类中都使用它(好吧,不是真的,因为您可以使用魔术方法来伪造它,但这通常只能作为最后的手段)。
这称为封装。局部变量通常是实现细节。这不应该暴露,因为调用代码(如果它被正确解耦)只关心你不关心你怎么做。
如果您的实现更改变量可能会被删除或更改,这意味着调用代码需要更改。方法对此进行抽象并允许内部更改而不影响公开的接口。
另一个原因是直接访问变量允许调用代码更改类所依赖的变量。方法允许创建例如数组的副本,以便更改数组的代码不会影响类的逻辑。