为什么我不能使用公共财产而不被低头看

时间:2013-08-28 19:52:59

标签: php oop design-patterns

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

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的更多内容。

2 个答案:

答案 0 :(得分:1)

如果你在getter和setter中做 nothing ,那么是的,你也可以公开这个属性。但是setter通常用于检查值以确保它有效:

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

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

尽早开始实际封装。

答案 1 :(得分:0)

这真的归结为open/closed principle

  

软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改

在此上下文中,原则意味着类的成员在默认情况下应该是私有

在某些情况下,您似乎可以宣布一个公共成员。你可以,但你不应该这样做也是如此。这部分只是为了避免不良习惯 - 将所有班级成员暴露给每个人都只是草率。

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