【发布时间】:2012-01-31 02:53:20
【问题描述】:
在内部使用属性时,编写 OOP 类的最佳实践是什么。
考虑下面的类;
<?php
Class Foo
{
/**
* @var null|string
*/
protected $_foo;
/**
* @return null|string
*/
public function getFoo()
{
return $this->_foo;
}
protected function _doSomething()
{
$foo = $this->_foo;
$result = null;
// ...
return $result;
}
}
正如你所见,我在 _doSomething() 中使用了属性 _foo,尽管子类可以覆盖 getFoo(),返回一个未存储回 _foo 的计算值;这是一个缺陷。
我该怎么办?
- 将 getter 标记为 final,在内部使用属性(没有额外的函数调用,强制最终开发者使用 _foo 作为属性,因为它是受保护的)
- 在内部使用 getFoo(),将 _foo 标记为私有(额外的函数调用)
这两个选项都是防水的,但我非常担心所有额外的函数调用,所以我倾向于使用选项 1,但选项 2 会更“真正的 OOP”恕我直言。
另请阅读http://fabien.potencier.org/article/47/pragmatism-over-theory-protected-vs-private,其中还建议了选项 2:/
另一个相关问题; 如果一个属性有一个设置器,该属性应该是私有的,强制最终开发人员在子类中使用它,还是应该是程序员负责设置有效属性值的不成文规则?
【问题讨论】:
-
选项 3:使用常规的
public属性并相信其他开发人员可以阅读 doc cmets。然而,这只是一个设计问题,所以很难说什么是对的,什么是错的。 (旁注:在 OOP-theory 中,属性定义状态,方法定义行为。在这种情况下,getter/setter 是错误的,因为访问属性不是一种行为) -
公共属性是个坏主意,它们允许外部代理使用类的内部状态。
-
PHP 中也没有“只读属性”之类的东西,所以你必须...(除了魔术 __get,它是隐式的;因此我喜欢 getter)
标签: php class properties getter