2015-12-26 17 views
5

Herkese merhaba ve Mutlu Noeller!Statik bir sınıfta veri depolama [PHP]

Verimlilikle ilgili bir sorun yaşıyorum ve StackOverflow topluluğunun bana yardımcı olabileceğini umuyorum.

(Statik) sınıflarımdan birinde, veritabanımdan büyük miktarda bilgi alan, bu bilgileri ayrıştıran ve biçimlendirilmiş bir diziye koyan bir işlev var. Bu sınıftaki birçok işlev, bu biçimlendirilmiş diziye ve sınıf boyunca, bunu birkaç kez söylerim; bu, uygulamanın, bu süreçleri birkaç kez tek bir işlemle gerçekleştirdiği anlamına gelir; Bu yüzden bunu yapmanın daha verimli bir yolu olup olmadığını merak ediyorum. Biçimlendirilmiş diziyi statik işlev içinde saklamak için bir yol var mı? Böylece biçimlendirilmiş diziden her bilgiye ihtiyacım olduğunda tüm işlemi yeniden yapmak zorunda kalmam.

private static function makeArray(){ 
    // grab information from database and format array here 
    return $array; 
} 

public static function doSomething(){ 
    $data = self::makeArray(); 
    return $data->stuff; 
} 

public static function doSomethingElse(){ 
    $data = self::makeArray(); 
    return $data->stuff->moreStuff; 
} 
+0

bir alma zorlamak istiyorsanız

public static function doSomething(){ $data = self::makeArray(); return $data->stuff; } 

'makeArray()' zaman her aynı çağrı sonucu mi? Eğer öyleyse, bunu statik bir özellikte önbelleğe alabilir ve daha önceden doldurulmuşsa geri dönebilirsiniz. –

+0

Veritabanındaki veriler güncelleştirilirse (ki bu sık sık gerçekleşmez ve elle yapılır), makeArray() öğesinin sonucunu değiştirir, böylece önbelleğe almak iyi bir seçenek olabilir. Böyle bir sonucu önbelleğe almayı nasıl önerirsiniz? – camrymps

cevap

3

makeArray() sonucu, komut biri çalışması sırasında değiştirmek alınmadan sonra ilk kez statik sınıf özelliğinde bunun sonucunu önbelleğe dikkate almak beklenen değilse. Bunu gerçekleştirmek için değişkenin boş olup olmadığını kontrol edin. Öyleyse, veritabanı eylemini gerçekleştirin ve sonucu kaydedin. Boş değilse, mevcut diziyi döndürmeniz yeterlidir.

// A static property to hold the array 
private static $array; 

private static function makeArray() { 
    // Only if still empty, populate the array 
    if (empty(self::$array)) { 
    // grab information from database and format array here 
    self::$array = array(...); 
    } 
    // Return it - maybe newly populated, maybe cached 
    return self::$array; 
} 

Dizinin yeni kopyasını zorlayan işleve bir boole parametresi bile ekleyebilirsiniz. Zaten yaptığımız gibi

// Add a boolean param (default false) to force fresh data 
private static function makeArray($fresh = false) { 
    // If still empty OR the $fresh param is true, get new data 
    if (empty(self::$array) || $fresh) { 
    // grab information from database and format array here 
    self::$array = array(...); 
    } 
    // Return it - maybe newly populated, maybe cached 
    return self::$array; 
} 

Diğer tüm sınıf yöntemleri self::makeArray() çağıran devam edebilir. İsteğe bağlı taze parametresi eklendi ve veritabanı

public static function doSomething(){ 
    // Call normally (accepting cached values if present) 
    $data = self::makeArray(); 
    return $data->stuff; 
} 
public static function doSomethingRequiringRefresh(){ 
    // Call with the $fresh param true 
    $data = self::makeArray(true); 
    return $data->stuff; 
}