2015-12-26 13 views
5

Ciao a tutti e buon Natale!Memorizzazione dei dati in una classe statica [PHP]

Ho qualche problema con l'efficienza e spero che la community di StackOverflow possa aiutarmi.

In una delle mie classi (statiche), ho una funzione che preleva una grande quantità di informazioni dal mio database, analizza tali informazioni e le inserisce in un array formattato. Molte funzioni all'interno di questa classe si basano su tale array formattato e in tutta la classe, lo chiamo più volte, il che significa che l'applicazione passa attraverso questi processi più volte in una singola esecuzione, cosa che presumo non sia molto efficiente. Quindi mi chiedo se ci sia un modo più efficiente per farlo. C'è un modo per me di archiviare l'array formattato all'interno della funzione statica in modo che non debba ripetere l'intero processo ogni volta che ho bisogno di informazioni dall'array formattato?

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

è il risultato di 'MakeArray()' sempre lo stesso su tutte le chiamate? In tal caso, è possibile memorizzarlo in una proprietà statica e restituirlo se già compilato. –

+0

Se i dati nel database vengono aggiornati (il che non accade spesso e viene eseguito manualmente), cambierà il risultato di makeArray(), quindi il caching potrebbe essere una buona opzione. Come suggeriresti di andare sul caching di un simile risultato? – camrymps

risposta

3

Se il risultato di makeArray() non dovrebbe cambiare durante una corsa dello script, prendere in considerazione la memorizzazione nella cache il risultato di essa in una proprietà di classe statica dopo la prima volta che viene recuperato. Per fare ciò, controlla se la variabile è vuota. In tal caso, eseguire l'azione del database e salvare il risultato. Se non vuoto, restituisce semplicemente l'array esistente.

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

Si può anche aggiungere un parametro booleano alla funzione che forza una nuova copia dell'array.

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

Tutti gli altri metodi della classe possono continuare a chiamare self::makeArray() come hai già fatto.

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

Se è stato aggiunto il parametro fresca opzionale e vuole forzare un recupero dal database

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