我想知道我是否可以使用静态变量进行优化:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
我知道初始化$i
后,在Bar()
的连续调用中,该行代码不会改变它。我假设这意味着每次打电话都不会评估moderatelyExpensiveFunctionCall()
,但我想肯定地知道。
一旦PHP看到一个已初始化的静态变量,它是否会跳过该行代码?换句话说,如果我拨打很多电话Bar()
,或者我在浪费时间,这是否会优化我的执行时间?
答案 0 :(得分:17)
我发现更容易做类似下面的代码。这样,缓存是全局完成的,而不是每次执行函数。
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
答案 1 :(得分:2)
static $i = blah()
将无法编译,因为php不允许在静态初始值设定项中使用表达式和函数调用。你需要像
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
答案 2 :(得分:2)
这应该适用于你的(非常简单)案例:
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
对于全局缓存机制,您可以使用类似于this one的方法。
答案 3 :(得分:0)
这是一个非常简短的方法:
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;
}
答案 4 :(得分:-2)
怎么样:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}