質問

最適化に静的変数を使用できるかどうか疑問に思っています。

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

一度は知っています $i が初期化されている場合、連続した呼び出しのコード行によって変更されることはありません。 Bar(). 。私 仮定する この意味は moderatelyExpensiveFunctionCall() 電話するたびに評価されるわけではありませんが、確実に知りたいのです。

PHP は初期化された静的変数を見つけると、そのコード行をスキップしますか?言い換えれば、多くの呼び出しを行った場合、実行時間は最適化されますか? Bar(), 、それとも時間を無駄にしているのでしょうか?

役に立ちましたか?

解決

私はそれが簡単に以下のコードのような何かを見つけます。そのように、キャッシュではなく、関数の実装あたりのグローバルに行われます。

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

他のヒント

PHPは、静的初期化子内の式や関数呼び出しを許可していないため、

static $i = blah()は、コンパイルされません。あなたは、

のようなものを必要とします
function foo() {
   static $cache = null;

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

   do something with $cache
}

これはあなたの(非常に単純な)ケースではうまくいくはずです:

function your_function() {
    static $output;

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

    return $output;
}

グローバル キャッシュ メカニズムに関しては、次のような方法を使用できます。 これです.

ここではかなり短いアプローチがあります:

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

いかがます:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top