在我的ZF项目中,我有一个模型,它必须处理存储在Zend_Registry中的大型数组。数组从缓存(而不是数据库)进入注册表。在请求期间,模型的不同方法可以多次使用该数组。考虑到最佳实践和优化的性能,我不确定是否应该:
专用财产示例:
class Application_Model_Category {
private $_tree = null;
...
public function _getTree() {
if (!$this->_tree) {
$this->_tree = Zend_Registry::get('tree');
}
return $this->_tree;
...
public function methodOne() {
foreach ($this->_getTree() as $category) {
...
}
}
public function methodTwo() {
$tree = $this->_getTree();
foreach ($tree as $category) {
...
$count = count($tree);
}
}
...
}
每次从注册表获取的示例:
class Application_Model_Category {
...
public function methodOne() {
foreach (Zend_Registry::get('tree') as $category) {
...
}
}
public function methodTwo() {
$tree = Zend_Registry::get('tree');
foreach ($tree as $category) {
...
$count = count($tree);
}
}
...
}
这些方式是否有任何差异(如内存或CPU使用情况)?或者第一种方法看起来有点好看?
答案 0 :(得分:2)
我不相信存在任何性能问题,因为数组实际上并未被复制,只是引用了。
但是,为了清晰和测试,我会为树添加公共getter / setter。你的getter可以像你一样从Zend_Registry
延迟加载,但至少允许公共setter更清楚地反映依赖性,并允许你使用模拟树进行测试。
答案 1 :(得分:2)
我肯定会选择第一个。如果有必要,将来更容易更改,它会更好地封装数据。 (真的在那句话中,第二件事是第一件事的原因。)
想一想:
如果您希望以后能够将参数传递给构造函数以允许覆盖从注册表中获取它的行为,那该怎么办?如果你使用第一种方法,你只需要在一个地方更改代码。
此外,使用第一个选项,如果扩展类,子类不需要了解getTree的工作方式。使用第二种方式,它也会依赖注册表。
基本上第一种方式会略微减少耦合,这很好。
答案 2 :(得分:1)
嗯,显然第一种方法,会使处理速度变慢,几乎可以忽略不计,但这一切都取决于您正在尝试创建的功能。您的第一种方法确保_tree
变量存在以继续处理,第二种方法不会因为它更有可能引发异常。我会推荐第一种方法,而不是第二种方法。