Статическая переменная для оптимизации
Мне интересно, могу ли я использовать статическую переменную для оптимизации:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
Я знаю, что после инициализации $i
она не будет изменена этой строкой кода при последовательных вызовах на Bar()
. Я предполагаю, что это означает, что moderatelyExpensiveFunctionCall()
не будет оцениваться каждый раз, когда я звоню, но я хотел бы знать наверняка.
Как только PHP увидит статическую переменную, которая была инициализирована, пропустит ли она эту строку кода? Другими словами, это будет оптимизировать мое время выполнения, если я сделаю много звонков на Bar()
, или я трачу свое время?
Ответы
Ответ 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();
}