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?

È stato utile?

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top