Ben gerçekten bu değişkenler fikrini sevmiyorum: bu görünümünde veya denetleyicisi ya daha kodu eklemek ve güzel gelmiyor.
Öte yandan, ben önbellek bu fikir gibi ... Olay Eğer çok karmaşık / overkill düşünüyorsanız.
Why not find some way in the middle ? Not use some cache like file/APC/memcache, but just keep the data in memory for the execution of the script ?
you can use a static variable for that ; either in your class, or directly in the method (depending on "does it make sense to share that cache between methods of the class ?")
Bu fikir göstermek için, kodu buraya hızlı bir bölümü var; Bu sınıf düşünün:
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 yöntem, statik bir değişken (orada olmak ve herhangi bir sınıfın örnekleri tarafından paylaşılan bu değişkenin, yalnızca bir örneği olacak) DB getirilen olmuştur veri depolamak için kullanır.
Eğer bu böyle dersek:
$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
Bu alırsınız:
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)
Yöntem, yeni bir parametre ile her çağrıldığında, bir bayan var, ve DB gidin. Bir parametre zaten bir kez kullanıldığında deniyor ama ne zaman, veri belleğinde - ve DB gitmez ;-)
Bu yardımcı olmaz? Ben tahmin ediyorum, senin durumunda, A sınıf btw, görünümü yardımcısıdır ;-) ve mt_rand ^ ^ DB sorgu olurdu
Bir dipnot düşmek gibi: Bu bazı RAM kullanmak gibi, çok büyük nesneler için yapılmamalı ... ve bu çok yok ...
Edit : as you are using Zend Framework, you might be interested in using Zend_Memory instead of that static variable : it deal with stuff like the amount of RAM taken (it can delete data from the "cache" if needed, for instance), if I remember correctly.
Ayrıca: evet, hala yöntemini birçok kez çağırıyor ... Ama bu sorgu yaparken daha iyi ... ve bu şekilde, Görünüm ne de Controller "önbellek" her türlü umurumda vardır: o değil onların iş.
Ve ayrıca: ben (onlara çok fazla değil sürece ben sadece küçük nesneleri bu şekilde saklamak gibi ve) herhangi bir sorun olmadan yıllardır bu tekniği kullanarak ettik; Ve ben bunu kullanarak tek ben değilim; Drupal Örneğin, çok kullanır.