variabile statica per l'ottimizzazione
-
20-09-2019 - |
Domanda
Mi chiedo se posso usare una variabile statica per l'ottimizzazione:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
Lo so che una volta $i
viene inizializzato, non sarà cambiata da quella riga di codice per le chiamate successive alla Bar()
. I assumere questo significa che moderatelyExpensiveFunctionCall()
non verrà valutato ogni volta che chiamo, ma mi piacerebbe sapere con certezza.
Una volta PHP vede una variabile statica che è stata inizializzata, vuol saltare su quella riga di codice? In altre parole, è questo andare per ottimizzare il mio tempo di esecuzione se faccio un sacco di chiamate a Bar()
, o sto sprecando il mio tempo?
Soluzione
Trovo più facile fare qualcosa di simile il codice qui sotto. In questo modo la cache viene fatto globalmente anziché per implementazione della funzione.
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
Altri suggerimenti
static $i = blah()
non si compila, perché PHP non consente espressioni e chiamate di funzione in inizializzatori statici. Hai bisogno di qualcosa come
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
Questo dovrebbe funzionare nel tuo caso (molto semplice):
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
Per quanto riguarda un meccanismo di caching globale, è possibile utilizzare un metodo simile a questo .
Ecco approccio molto più breve:
function stuff()
{
static $smthg = []; // or null, or false, or something else
if ($smthg) {
return $smthg;
}
// filling $smthg goes here
// with a lot of
// code strings
return $smthg;
}
Come su:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}