Pergunta

Estou me perguntando se posso usar uma variável estática para otimização:

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

Eu sei disso uma vez $i é inicializado, ele não será alterado por essa linha de código em chamadas sucessivas para Bar(). EU presumir Isso significa que moderatelyExpensiveFunctionCall() Não será avaliado toda vez que ligar, mas gostaria de saber com certeza.

Depois que o PHP vê uma variável estática que foi inicializada, ele pula sobre essa linha de código? Em outras palavras, isso vai otimizar meu tempo de execução se eu fizer muitas chamadas para Bar(), ou estou perdendo meu tempo?

Foi útil?

Solução

Acho mais fácil fazer algo como o código abaixo. Dessa forma, o cache é feito globalmente, em vez de por implementação da função.

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

Outras dicas

static $i = blah() Não vai compilar, porque o PHP não permite expressões e chamadas de função nos inicializadores estáticos. Você precisa de algo como

function foo() {
   static $cache = null;

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

   do something with $cache
}

Isso deve funcionar no seu caso (bastante simples):

function your_function() {
    static $output;

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

    return $output;
}

Quanto a um mecanismo global de cache, você pode usar um método semelhante a Este.

Aqui está uma abordagem bastante mais curta:

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 tal:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top