zoukankan      html  css  js  c++  java
  • php static 变量用法

    有时候我们可能需要重复调用一个函数,里面有些变量不需要重复初始化、初始化成本比较高的,我们可以使用 static 关键字修饰,在该变量没有初始化的时候才进行初始化,初始化过的变量就不再初始化。如:

    function test()
    {
        echo __FUNCTION__ . "
    ";
        return mt_rand(10, 20);
    }
    
    function call()
    {
        static $test;
        if (is_null($test)) {
            $test = test();
        }
        
        echo $test . "
    ";
    }
    
    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
    

      

  • 相关阅读:
    整理 修改功能测试点
    centos 修改yum镜像源
    修改Docker容器的时间和宿主机一致
    Postgre Invalid command l;. Try ? for help.
    RGB渐变算法(JavaScript)
    docker postgre&postgis
    activiti+spring boot 报错: java.lang.NoClassDefFoundError: org/springframework/core/log/LogMessage
    Docker 创建 Postgre
    Jenkins+Gitlab+Maven 远程部署
    docker安装centos并ssh连接
  • 原文地址:https://www.cnblogs.com/eleven24/p/8993540.html
Copyright © 2011-2022 走看看