Статическая переменная для оптимизации - PullRequest
12 голосов
/ 19 марта 2010

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

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

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

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

Ответы [ 5 ]

17 голосов
/ 19 марта 2010

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

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}
2 голосов
/ 20 апреля 2013

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

function your_function() {
    static $output;

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

    return $output;
}

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

2 голосов
/ 19 марта 2010

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

function foo() {
   static $cache = null;

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

   do something with $cache
}
0 голосов
/ 02 мая 2016

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

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;
}
0 голосов
/ 19 марта 2010

Как насчет:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...