我看到(并编写)了很多这样的代码:
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的更多内容。
如果你在getter和setter中什么都不做,那么是的,你还不如公开这个属性。但setter通常用于检查值以确保其有效:
public function setFoo($foo) {
if (!is_string($foo)) {
throw new InvalidArgumentException('No you foo-l!');
}
$this->foo = $foo;
}
这样做是一个好主意,以确保类的完整性,这就是封装的目的。即使你现在不做这个检查,你也可能在修复了由于设置无效值而导致的第三个错误后,在将来添加它。如果你突然开始切换到方法调用而不是属性分配,你将很难修改所有设置属性的代码。
最好尽早从实际封装开始。
这实际上可以归结为打开/关闭原理:
软件实体(类、模块、功能等)应开放用于扩展,但关闭用于修改
在这种情况下,原则意味着类的成员在默认情况下应该是私有的。
在某些情况下,你可能只需要声明一名公众成员。你可以,但这仍然是事实,你不应该这样做作为一个规则。这在一定程度上只是为了避免坏习惯——把一个班的所有成员都暴露在每个人面前是草率的。
这也是一个表明你意图的问题:如果有人看到一名公众成员,他们会怎么想?目前还没有办法知道作者是否打算公开该成员,或者他们只是不知道自己在做什么。