Question

Je me demande si je peux utiliser une variable statique pour l'optimisation:

public function Bar() {
    static $i = moderatelyExpensiveFunctionCall();
    if ($i) {
        return something();
    } else {
        return somethingElse();
    }
}

Je sais qu'une fois $i est initialisé, il ne sera pas modifié par par cette ligne de code sur les appels successifs à Bar(). I Supposons , cela signifie que moderatelyExpensiveFunctionCall() ne sera pas évalué chaque fois que je l'appelle, mais j'aimerais savoir pour certains.

Une fois que PHP voit une variable statique qui a été initialisé, est-il sauter sur cette ligne de code? En d'autres termes, cela va optimiser mon temps d'exécution si je fais beaucoup d'appels à Bar(), ou suis-je perdre mon temps?

Était-ce utile?

La solution

Je trouve plus facile de faire quelque chose comme le code ci-dessous. De cette façon, la mise en cache se fait à l'échelle mondiale plutôt que par la mise en œuvre de la fonction.

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}

Autres conseils

static $i = blah() ne compile pas, parce que php ne permet pas les expressions et les appels de fonctions dans initialiseurs statiques. Vous avez besoin de quelque chose comme

function foo() {
   static $cache = null;

   if(is_null($cache)) $cache = expensive_func();

   do something with $cache
}

Cela devrait fonctionner dans votre (très simple) cas:

function your_function() {
    static $output;

    if (!isset($output)) {
       $output = 'A very expensive operation';
    }

    return $output;
}

En ce qui concerne un mécanisme de mise en cache globale, vous pouvez utiliser une méthode similaire à celui-ci .

Voici approche assez courte:

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

Que diriez-vous:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top