2011-11-07 46 views
0

基本上,我正在實現自己的緩存系統。理想情況下,它看起來像這樣:PHP緩存結構(跳轉代碼塊,如果HIT)

$CACHE->start($name); 
    //CODE 
$CACHE->end(); 

但是,這是一個聖盃,我不希望找到。基本上,$ CACHE-> start()檢查緩存是命中還是未命中,並且它是否是命中,它跳過// CODE直到$ CACHE-> end()。

到目前爲止,我已經來了,最好是:

if ($CACHE->start($name)) { 
    //CODE 
} 
$CACHE->end(); 

由於PHP支持匿名函數,我在想:

$CACHE->make($name, function() { 
    //CODE 
}); 

但這段代碼有問題的代碼是不是在相同的變量範圍。任何機會繞過?

更新:我已經切換到紅寶石,它允許將塊傳遞給一個函數,完成這項任務。

+0

還有一個想法是用GOTO語句,但就是這麼難看,我不打算使用。 –

+0

您可以通過將'use($ var1,$ var2,...)'添加到匿名函數定義來訪問特定變量,但是無法使父範圍中的所有變量都可用。 –

+1

if($ cache-> start()){....} $ cache-> end();可能和它一樣好。 Zend Framework包含一個緩存,該緩存通過假設頁面的其餘部分是緩存內容的一部分來跳過$ cache-> end()。雖然不適合所有情況。 – rrehbein

回答

1

Zend Framework包含一個cache,它通過假設頁面的其餘部分是緩存內容的一部分而跳過$cache->end()

// Default cache ID is calculated from $_SERVER['REQUEST_URI'] 
$zendPageCache->start(); 

// .... 

// No need for end 

但它並不適合所有的使用情況。

(我的意見的修改版本)

2

默認方法如何?下面的例子非常常見,並且使用它memcached f.e.

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; 
    } 

這是基本的鍵值存儲,並且不需要任何關閉技巧。

+0

是的,但這不是很簡單。這也很難記住。 –

1

在匿名函數中,您可以使用'use'關鍵字將變量帶入該範圍。

<?php 
function() use ($container, $anythingElseYouMayWantToUse) { 
    //... 
} 

你可能實現的第一個與goto,但它是一個非常粗魯的方式,你會被看作是編程的敵人。如果我不得不選擇,我會去第二個。