有时候我们可能需要重复调用一个函数,里面有些变量不需要重复初始化、初始化成本比较高的,我们可以使用 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

  

php static 变量用法的更多相关文章

  1. Java中static变量作用和用法详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  2. Asp.net中static变量和viewstate的使用方法(谨慎)

    在.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是.这样非常方便,下一次调用某个函数时该变量仍然保存的是 ...

  3. static之用法

    本文转载于http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html 在C语言中,static的字面意思很容易把我们导入歧途,其实它 ...

  4. static关键字用法

    java中static关键字可用于修饰: 1.属性:表示该属性变量在类被加载时即被创建并初始化,类加载过程只进行一次,因此静态变量也只被创建一次 2.方法:静态方法为类的公有方法,可直接用‘类名.方法 ...

  5. Java中static的用法

    static静态,作为修饰符,最初是由c引入,一开始static表示退出一个块后依然存在的局部变量.随后,static表示不能被其他文件访问的全局变量和函数.到了C++和java,static表示属于 ...

  6. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  7. typedef,static,const用法

    一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...

  8. (转)static 变量

    一. static 变量 static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.2. 用于全局变量,主要作用是限制此全局变量被其他的文 ...

  9. C/C++中关键字static的用法及作用

    本文将主要从static在C和C++共有的作用及C++特有的作用两个方面进行解析. 在C和C++中共有的作用 隐藏(对变量.函数均可) 当同时编译多个文件时,所有未加static前缀的全局变量或全局函 ...

随机推荐

  1. python 根据年月日,计算是这一年中的第几天

    利用python计算某一天是这一年中的第几天,例如,给定年份= 2019年,月份= 1,日期= 3,则返回3:因为2019-01-03日期是2019年的第3 天. 首先,我们要知道闰年.平年怎么区分: ...

  2. Scrum Meeting 10 -2014.11.16

    开始进入大项目的整合阶段,平时和其他两个小组交流较少,整合难度还是存在的. 在具体整合前,让开发人员添加了些必要的注释,优化代码结构,方便阅读. Member Today’s task Next ta ...

  3. 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实  验  报  告 课程: Java        班级:1352          姓名:黄伟业         学号:20135215 成绩:           ...

  4. java程序设计第二次实验报告

    北京电子科技学院(BESTI) 实验报告 课程:数据结构    班级:1352    姓名:何伟钦     学号:20135223 成绩:            指导教师:娄嘉鹏      实验日期: ...

  5. Software-Defined Networking A Comprehensive Survey(一)

    传统网络:1 复杂,难于管理 2 很难实现根据之前定义的方案进行配置,3 对于缺陷.变化不能够再次进行配置 4 控制和数据平面绑定在一起,使许多缺陷难于解决 SDN网络:通过打破传统网络垂直整合,从底 ...

  6. python learning Process and Thread.py

    # 多进程 # Windows下面没有fork ,请在linux下跑下面的代码 import os print('Process (%s) start...' % os.getpid()) pid = ...

  7. 【CSAPP笔记】4. 汇编语言——基础知识

    程序的机器级表示 计算机能读懂是机器代码(machine code)-- 用字节序列编码的低级操作 -- 也就是0和1.编译器基于编程语言的规则.目标机器的指令集和操作系统的规则,经过一系列阶段产生机 ...

  8. js数组遍历 千万不要使用for...in...

    昨天做个下拉框 扩充了一下数组的方法 Array.prototype.remove = function (val) { var index = this.indexOf(val); if (inde ...

  9. js ajax 经典案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Boa服务器移植

    Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右.作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求.但Boa支持CGI,能够为C ...