基本上,我正在实现自己的缓存系统。理想情况下,它看起来像这样:
$CACHE->start($name);
//CODE
$CACHE->end();
但那是我不希望找到的圣杯。基本上,$CACHE->start()检查缓存是命中还是未命中,如果是命中,它将跳过//CODE,直到$CACHE->end()。
我到目前为止最好的成绩是:
if ($CACHE->start($name)) {
//CODE
}
$CACHE->end();
由于PHP支持匿名函数,我想:
$CACHE->make($name, function() {
//CODE
});
但是这段代码有一个问题,代码不在同一个变量范围内。有办法绕过它吗?
更新:我已经切换到ruby,它允许将块传递给函数,非常适合此任务。
默认方法如何?下面的例子很常见,在memcached中经常使用。
function doSomething()
{
$oCache = SomeRegistry::get('Cache');
// Check for cached results.
if ($oCache->exists('someKey')) {
return $oCache->get('someKey');
}
$sCached = getSomeThing();
$this->set('someKey', $sCached);
return $sCached;
}
它是基本的键值存储,不需要任何闭包技巧
Zend Framework包含一个跳过$cache->end()
的缓存,假设页面的其余部分是缓存内容的一部分。
// Default cache ID is calculated from $_SERVER['REQUEST_URI']
$zendPageCache->start();
// ....
// No need for end
它并不适合所有的用例。
(我的评论的修改版本)
在匿名函数中,您可以使用'use'关键字将变量引入该作用域。
<?php
function () use ($container, $anythingElseYouMayWantToUse) {
//...
}
你可以用goto实现第一个,但这是一种非常粗鲁的方法,你会被视为编程的敌人。
如果非要我选的话,我会选第二个