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

  

posted @ 2018-05-05 08:08  佚名000  阅读(218)  评论(0编辑  收藏  举报