好的,这真的让我很烦恼,我开始认为这一切都归结为个人选择,而不是更高效或编写更好代码的特定方式:我应该还是不应该在内部使用 getter/setter 方法一个PHP项目?到目前为止,我读过的答案相当矛盾,并不完全适合 PHP,它不是一种编译语言。例如,在 Stack Overflow 上回答这个问题(“Why use getters and setters ?”)。关于为什么我应该在我的代码中使用它们有很多很好的理由,但是所有子评论都提到了 Accessors are evil并且应该避免,穿插在一些更令人不安的评论之间,这些评论提到应该完全避免它们,因为它“弄乱了你的代码”。
我得到的只是相互矛盾的答案,它们都与解释的 PHP 环境无关。有人可以阐明为什么/为什么不应该在 PHP 中使用它们,以及他们做出该决定的理由吗?如果我们可以简单地将属性定义为私有(private)或 protected ,这真的很重要吗?无论如何:
The encapsulation getters and setters offer are laughably thin
... 引用自“sbi”(为什么使用 getter 和 setter?)
就个人而言,我仍然不明白如何:
Class Foo {
public $bar;
function setBarType($val) {
$this->bar = $val;
}
}
$fee = new Foo();
$fee->setBarType(42);
优于这个:
Class Foo {
public $bar;
}
$fee = new Foo();
$fee->bar = 42;
最佳答案
您链接到的博客文章以关键句子开头(已添加重点):
Every getter and setter in your code represents a failure to encapsulate and creates unnecessary coupling.
封装是面向对象编程最重要的思想。它本质上可以归结为隐藏复杂性,方法是将复杂性整齐地包装在类中。在一个理想的世界中,当您使用一个类时,您不应该任何了解它的内部运作或状态。有些人(比如这个博客作者)会争辩说,拥有 getter 和 setter 已经是关于类内部的太多信息了。在他们看来,一个类应该只具有使我们能够告诉对象做某事的方法,而不必在意如何它是如何做的或者它处于什么状态。使用setter 不是“告诉对象做某事”,而是从外部处理对象的状态。
而不是这样做:
$a = myObject();
// Querying object state, making a decision outside the object, and changing its state
if ($a->getWarbleFizz() < 42) {
$a->setYourWarbleFizzTo(42);
}
// Gee, I hope I made the right decision...
$a->nowDoSomethingUseful();
你应该这样写代码:
$a = myObject(42);
$a->doStuff();
或者这个:
$a = myObject();
$a->doStuff(42);
相关阅读:Tell, don't ask .
关于php - 我应该还是不应该使用 getter 和 setter 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18351877/