views:

88

answers:

4

I'm wondering if I can use a static variable for optimization:

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

I know that once $i is initialized, it won't be changed by by that line of code on successive calls to Bar(). I assume this means that moderatelyExpensiveFunctionCall() won't be evaluated every time I call, but I'd like to know for certain.

Once PHP sees a static variable that has been initialized, does it skip over that line of code? In other words, is this going to optimize my execution time if I make a lot of calls to Bar(), or am I wasting my time?

A: 

How about:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Coronatus
I tested that. `isset()` seems to always return false.
keithjgrant
A: 

static $i = blah() won't compile, because php doesn't allow expressions and function calls in static initializers. You need something like

function foo() {
   static $cache = null;

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

   do something with $cache
}
stereofrog
+1  A: 
static $i = moderatelyExpensiveFunctionCall();

That won't ever be evaluated because it will result in a parse error! :)

webbiedave
+2  A: 

I find it easier to do something like the code below. That way the caching is done globally instead of per implementation of the function.

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}
Kendall Hopkins
Good call. That's where the real problem lies. It's an older piece of code that could probably use the optimization check.
keithjgrant