php static 变量用法
有时候我们可能需要重复调用一个函数,里面有些变量不需要重复初始化、初始化成本比较高的,我们可以使用 static 关键字修饰,在该变量没有初始化的时候才进行初始化,初始化过的变量就不再初始化。如:
function test() { echo __FUNCTION__ . "\n"; return mt_rand(10, 20); } function call() { static $test; if (is_null($test)) { $test = test(); } echo $test . "\n"; } call(); call(); call();
上面会输出:
test 13 13 13
从上面的结果可以看出,static 变量只初始化了一次,而这个变量在该进程的生命周期内都是可用的,在我们调用了 test 之后,该变量的值仍然可用,这就是 static 的好处。
有哪些场景会用到呢?比如,可能这个初始化的变量来自于数据库查询,而这个查询结果不会在本次请求中发生变化的。也许大家想到的一个方法是,在该方法外部进行初始化,然后把初始化之后的变量作为参数传递进去,但是这样一来会多了个不必要的参数(当然,如果该次初始化需要外部条件另说),而且,本来出现在该函数内部的逻辑放在了函数外部,这样一来,如果其他地方也要调用该方法,那么也要进行一次重复的初始化操作,代码就会有冗余。
⚠️ 有一种情况需要注意的:
对象方法里面有 static 变量,如果对象序列化,该静态变量的值也会保存下来。这可能不是我们想要的结果,这时候我们可能需要考虑一下 __sleep、__wakeup 方法的使用了。
这种情况表现如下:
class Person { public function test() { static $a = 1; echo $a++ . PHP_EOL; } } $person = new Person(); $person->test(); $person->test(); $s = serialize($person); $p = unserialize($s); $p->test(); $p->test();
输出:
1 2 3 4