Подтвердить что ты не робот

Статическая переменная для оптимизации

Мне интересно, могу ли я использовать статическую переменную для оптимизации:

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

Я знаю, что после инициализации $i она не будет изменена этой строкой кода при последовательных вызовах на Bar(). Я предполагаю, что это означает, что moderatelyExpensiveFunctionCall() не будет оцениваться каждый раз, когда я звоню, но я хотел бы знать наверняка.

Как только PHP увидит статическую переменную, которая была инициализирована, пропустит ли она эту строку кода? Другими словами, это будет оптимизировать мое время выполнения, если я сделаю много звонков на Bar(), или я трачу свое время?

4b9b3361

Ответ 1

Мне легче сделать что-то вроде кода ниже. Таким образом, кэширование выполняется глобально вместо реализации функции.

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

Ответ 2

static $i = blah() не будет компилироваться, поскольку php не разрешает выражения и вызовы функций в статических инициализаторах. Вам нужно что-то вроде

function foo() {
   static $cache = null;

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

   do something with $cache
}

Ответ 3

Это должно работать в вашем (довольно простом) случае:

function your_function() {
    static $output;

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

    return $output;
}

Что касается глобального механизма кэширования, вы можете использовать метод, аналогичный этот.

Ответ 4

Вот довольно короткий подход:

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

Ответ 5

Как насчет:

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