12

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

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

$iが初期化されると、 への連続した呼び出しでそのコード行によって変更されないことを私は知っていBar()ます。これは、呼び出すmoderatelyExpensiveFunctionCall()たびに評価されないことを意味すると思いますが、確実に知りたいです。

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

4

5 に答える 5

18

以下のコードのようなことを行う方が簡単だと思います。このようにして、キャッシングは関数の実装ごとではなくグローバルに行われます。

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}
于 2010-03-18T22:14:30.997 に答える
2

これは(非常に単純な)ケースで機能するはずです:

function your_function() {
    static $output;

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

    return $output;
}

グローバル キャッシング メカニズムについては、これと同様の方法を使用できます。

于 2013-04-20T16:57:18.017 に答える
2

static $i = blah()PHP は静的初期化子での式と関数呼び出しを許可しないため、コンパイルされません。次のようなものが必要です

function foo() {
   static $cache = null;

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

   do something with $cache
}
于 2010-03-18T22:03:43.157 に答える
-2

どうですか:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
于 2010-03-18T21:54:43.363 に答える