我不太喜欢这种变量的想法:它在视图或控制器中添加了更多代码,感觉不太好。
另一方面,我喜欢缓存的这种想法……如果您认为它太复杂/矫枉过正,那就是事件。
为什么不在中间找到一些方法?不使用文件/APC/memcache 之类的缓存,而只是将数据保存在内存中以执行脚本?
您可以为此使用静态变量;在您的类中或直接在方法中(取决于“在类的方法之间共享该缓存是否有意义?”)
为了说明这个想法,这里有一小段代码;考虑这个类:
class A {
public function test($param) {
static $cache = array();
if (isset($cache[$param])) {
var_dump("cache hit : $param = {$cache[$param]}");
return $cache[$param];
} else {
// Fetch from DB (here, simulated ^^ )
$cache[$param] = mt_rand(0, 9999);
var_dump("cache miss : $param = $cache[$param]");
return $cache[$param];
}
}
}
该test
方法使用一个静态变量(该变量只有一个实例,由该类的任何实例共享)来存储从数据库中获取的数据。
如果你这样称呼它:
$a = new A();
$b = new A();
$a->test(10); // miss
$a->test(15); // miss
$b->test(10); // hit
$b->test(25); // miss
$a->test(25); // hit
你会得到这个:
string 'cache miss : 10 = 3745' (length=22)
string 'cache miss : 15 = 7800' (length=22)
string 'cache hit : 10 = 3745' (length=21)
string 'cache miss : 25 = 8623' (length=22)
string 'cache hit : 25 = 8623' (length=21)
每次使用新参数调用该方法时,都会错过,然后您转到数据库。但是当一个参数已经使用过一次时调用它时,数据在内存中——你不需要去数据库;-)
那不会有帮助吗?我猜,在你的情况下,A
类是视图助手,顺便说一句;-) 并且mt_rand
将是一个数据库查询 ^^
作为旁注:对于太大的对象不应该这样做,因为它会使用一些 RAM ......并且没有很多......
编辑:当您使用 Zend 框架时,您可能有兴趣使用Zend_Memory
而不是那个静态变量:它处理诸如占用的 RAM 量之类的东西(例如,如果需要,它可以从“缓存”中删除数据),如果我记得正确。
另外:是的,您仍然多次调用该方法...但这比进行查询要好...而且,这样,视图和控制器都不必关心任何类型的“缓存”:这不是他们的工作。
而且:我多年来一直在使用这种技术,没有任何问题(只要我只以这种方式存储小物体,而不是太多);而且我不是唯一一个使用它的人;例如,Drupal 也使用它。