Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

function foo() {
   static $cache = null;

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

   do something with $cache
}

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

function your_function() {
    static $output;

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

    return $output;
}

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

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

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

Как насчет:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top