php - 我应该还是不应该使用 getter 和 setter 方法?

标签 php oop getter-setter

好的,这真的让我很烦恼,我开始认为这一切都归结为个人选择,而不是更高效或编写更好代码的特定方式:我应该还是不应该在内部使用 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/

相关文章:

swift - 在 Swift 中覆盖 getter

php - 使用 php 从 html 创建一个 img?

php - 带有 PHP 示例的一般多态性

c# - C#中对象是如何存储在内存中的?

c++ - C++中的二维对象数组

java - Setter 方法,多个不带参数还是单个带值?

javascript - 使用 post 将 span 值发送到 php 脚本

php - YII 2.0 REST API 错误处理程序

c# - 多个包装器 - 如何做?

javascript - 是否有所有属性的 Object.watch/__noSuchMethod__ 可用的垫片?