2

我看到(并编写)了很多这样的代码:

class MyClass
{
    private $_myProperty;

    public function setMyPropert($myProperty)
    {
         $this->_myProperty = $myProperty;
    }

    public function getMyProperty()
    {
         return $this->_myProperty;
    }
}

因为我们被教导类属性应该始终是私有的。

但是,我真的只想在上述情况下这样做:

class MyClass
{
    public $myProperty;
}

那是更少的代码,更容易阅读。但是其他开发人员会看不起这段代码,很可能它会通过代码审查等。即使没有,我仍然不会这样做,因为害怕别人看到它并做出判断。

为什么呢?这是在 oop 代码开发人员中根深蒂固的东西吗?或者还有其他我失踪的原因,可能与测试、未来维护或其他不明显的技术原因有关。我是在 getter/setter 注意到更多 get/set 的情况下专门讨论的。

4

2 回答 2

1

如果您在 getter 和 setter 中什么都不做那么是的,您也可以将属性公开。但是 setter 通常用于检查值以确保其有效:

public function setFoo($foo) {
    if (!is_string($foo)) {
        throw new InvalidArgumentException('No you foo-l!');
    }
    $this->foo = $foo;
}

这样做以确保类的完整性是一个好主意,这就是封装的目的。即使您现在不进行此检查,您也可能会在修复因设置无效值而导致的第三个错误之后添加它。如果您突然开始切换到方法调用而不是属性分配,那么您将很难修改所有设置属性的代码。

最好尽早开始实际封装。

于 2013-08-28T20:01:15.887 回答
0

这真的归结为开放/封闭原则

软件实体(类、模块、函数等)应该对扩展开放,对修改关闭

在这种情况下,该原则意味着一个类的成员默认应该是私有的

在某些情况下,您似乎可以只声明一个公共成员。你可以,但你仍然不应该按照规则这样做。这在一定程度上只是避免了坏习惯——把一个班级的所有成员都暴露给每个人只是马虎。

这也是一个表明你的意图的问题:如果有人看到一个公共成员,他们会怎么想?没有直接的方法可以知道作者是否打算让成员公开,或者他们是否真的不知道他们在做什么。

于 2013-08-28T20:02:56.327 回答