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

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

这应该适用于您的(非常简单的)情况:

function your_function() {
    static $output;

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

    return $output;
}

至于全局缓存机制,可以使用类似这个的方法。

于 2013-04-20T16:57:18.017 回答
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;
}
于 2016-05-02T17:43:45.693 回答
-2

怎么样:

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