我有两个方法
private function cacheAdd($id,$data)
{
$this->minicache->set($id,$data);
}
private function cacheGet($id)
{
return $this->minicache->get($id);
}
每次如果我想检查项目是否被缓存,我必须做类似的事情:
public function getFriendIds()
{
$info = $this->cache->minicache->getInfo("getFriendIds"); // if its an array then it is cached
if(is_array($info))
{
return $this->cache->cacheGet("getFriendIds"); // return the cached object
}
// from here items wasnt cached
else
{
$this->cache->cacheAdd("getFriendIds",$this->twitter->getFriendIds()); // so add to cache
return $this->cache->cacheGet("getFriendIds"); // and return the cached items
}
}
但我认为有一种简单的方法可以做到这一点吗?
我想到这样的事情:
$this->cache->docache($this->myitems());
方法docache只接受方法并将methodname转换为字符串并检查项目是否已经缓存?如何才能完成?
编辑:
我实现了这个docache方法
public function docache($id,$data)
{
$info = $this->minicache->getInfo($id);
if(is_array($info))
{
return $this->cache->cacheGet($id); // return the cached object
}
else
{
$this->cacheAdd($id,$data); // so add to cache
return $this->cacheGet($id); // and return the cached items
}
}
如果我想调用方法,我就这样做。
public function getFriendIds()
{
return $this->cache->docache("getFriendIds",$this->twitter->getFriendIds());
}
不,这不是小得多吗?
答案 0 :(得分:1)
我认为getFriendIds
是所有类似模式的一系列方法之一,你想要做的就是让所有这些方法都长一行(左右)。在这种情况下,您可以将getFriendIds
重构为您想要的方法:
protected function memoize($name, $callable, $args=array()) {
$info = $this->cache->minicache->getInfo($name); // if its an array then it is cached
if(is_array($info)) {
return $this->cache->cacheGet($name); // return the cached object
} else {
$this->cache->cacheAdd($name, call_user_func_array($callable, $args));
return $this->cache->cacheGet($name); // and return the cached items
}
}
public function getFriendIds() {
$this->memoize(__METHOD__, array($this->twitter, __FUNCTION__));
}
未经测试,因此可能存在一些问题。
答案 1 :(得分:1)
你也可以在这里保存几行。
public function docache($id,$data)
{
$info = $this->minicache->getInfo($id);
if(!is_array($info))
{
$this->cacheAdd($id,$data); // so add to cache
}
return $this->cache->cacheGet($id); // return the cached object
}
答案 2 :(得分:1)
你可以通过这种方式缩小(和更快): 它只能防止存储$ info变量,所以它的速度要快一些。 ;) 代码要短得多:p
public function docache($id,$data){
if(!is_array($this->minicache->getInfo($id))) $this->cacheAdd($id,$data); // add to cache if theres none
return $this->cacheGet($id); // and return the cached items
}
编辑:哦,我们同时发布了相同的代码:p