我看到(并写了)很多像这样的代码:
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的更多内容。
答案 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:
软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改
在此上下文中,原则意味着类的成员在默认情况下应该是私有 。
在某些情况下,您似乎可以宣布一个公共成员。你可以,但你不应该这样做也是如此。这部分只是为了避免不良习惯 - 将所有班级成员暴露给每个人都只是草率。
这也是一个表明你意图的问题:如果有人看到公众成员,他们会怎么想?没有直接的方法可以知道作者是否打算让该成员公开,或者他们是否真的不知道他们在做什么。