用于优化的静态变量

时间:2010-03-18 21:49:53

标签: php optimization static-variables

我想知道我是否可以使用静态变量进行优化:

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

我知道初始化$i后,在Bar()的连续调用中,该行代码不会改变它。我假设这意味着每次打电话都不会评估moderatelyExpensiveFunctionCall(),但我想肯定地知道。

一旦PHP看到一个已初始化的静态变量,它是否会跳过该行代码?换句话说,如果我拨打很多电话Bar(),或者我在浪费时间,这是否会优化我的执行时间?

5 个答案:

答案 0 :(得分:17)

我发现更容易做类似下面的代码。这样,缓存是全局完成的,而不是每次执行函数。

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

答案 1 :(得分:2)

static $i = blah()将无法编译,因为php不允许在静态初始值设定项中使用表达式和函数调用。你需要像

这样的东西
function foo() {
   static $cache = null;

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

   do something with $cache
}

答案 2 :(得分:2)

这应该适用于你的(非常简单)案例:

function your_function() {
    static $output;

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

    return $output;
}

对于全局缓存机制,您可以使用类似于this one的方法。

答案 3 :(得分:0)

这是一个非常简短的方法:

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

答案 4 :(得分:-2)

怎么样:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}