php之static静态变量详解
php之static静态变量详解
一、总结
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
二、php之static静态变量详解
1、什么是static静态变量?(以下为在C语言中的理解)
静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该 区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而 auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作 用域之外不能使用。
另外,属于静态存储方式的变量不一定就是静态变量。 例如:外部变量(在PHP中指全局变量)虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
2、静态局部变量:
1、static类型的内部变量同auto自动变量(即未加 static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,两者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。
4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(主要是变量的作用域造问题成的),因此仍以采用局部静态变量为宜。
注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。
3、静态全局变量
全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于:
1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
4、PHP中代码实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?php
//--------------如何理解static静态变量-----------
/** 普通局部变量 */
function local() {
$loc = 0; //这样,如果直接不给初值0是错误的。
++ $loc ;
echo $loc . '<br>' ;
}
local(); //1
local(); //1
local(); //1
echo '===================================<br/>' ;
/** static静态局部变量 */
function static_local() {
static $local = 0 ; //此处可以不赋0值
$local ++;
echo $local . '<br>' ;
}
static_local(); //1
static_local(); //2
static_local(); //3
//echo $local; 注意虽然静态变量,但是它仍然是局部的,在外不能直接访问的。
echo '=======================================<br>' ;
/** static静态全局变量(实际上:全局变量本身就是静态存储方式,所有的全局变量都是静态变量) */
function static_global() {
global $glo ; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
$glo ++;
echo $glo . '<br>' ;
}
static_global(); //1
static_global(); //2
static_global(); //3
?>
|
三、测试题-简答题
1、静态变量的存储位置在哪?
解答:static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出)
2、静态局部变量是什么?
解答:局部变量用static关键词修饰,储存到全局数据区,static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。
3、函数体内如果在定义静态变量的同时进行了初始化,那么下次执行程序的时候还会初始化么?
解答:函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
4、静态局部变量的初始化在函数中只执行一次,那么静态局部变量的赋初值也只执行一次么?
解答:静态变量的赋初值会调用一次函数执行一次,一般会执行很多次,和静态函数的初始化不同。
5、静态局部变量和局部变量的区别?
解答:把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。作用域还相同。
6、静态全局变量和全局变量的区别?
解答:把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效。非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
7、静态局部变量适合多用么?
解答:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。
php之static静态变量详解相关推荐
- php的 静态变量,PHP之static静态变量详解
在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...
- C语言static静态变量详解
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为静态局部变量,用关键字static进行声明. 通过用static类型声明后的变量,其变量的内存空间位于内存的全局静 ...
- Java static静态关键字详解(public、 private、 volatile)
文章目录 前言 static要解决什么问题? 格式 特点 static静态变量 静态变量和实例变量的区别 static静态方法 static应用场景 static 与volatile static如何 ...
- (35)System Verilog类静态变量详解
(35)System Verilog类静态变量详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类静态变量详解 5)结语 1.2 F ...
- C++ static静态成员变量详解
对象的内存中包含了成员变量,不同的对象占用不同的内存(已在<C++对象的内存模型>中提到),这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.例如有两个相同类型的对象 a.b, ...
- Python 全局变量、局部变量、静态变量 详解
参考连接: 1. http://blog.csdn.net/eastmount/article/details/48766861 2. http://www.imooc.com/article/146 ...
- python静态变量 详解
实例1 class A:## 静态变量a = 12def __init__(self, a):##成员变量self.a = aprint(A.a) # 12 print(A(0).a) # 0 静态变 ...
- 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解
原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...
- Java简单类、变量详解(概念和分类、声明、命名、初始化)
1初识JAVA简单类 (1)创建第一个Java程序的具体步骤: 第一步:创建一个工程,在Package Explorer空白区域中右击New->点击Java Project->填写Proj ...
最新文章
- python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法
- mysql mrr_cost_based_mysql mrr介绍
- BZOJ 3112 Zjoi2013 防守战线 单纯形
- python发送邮件-实操记录-发送一封普通的邮箱
- presto .vs impala .vs HAWQ query engine
- VIP 时代,详解会员营销系统架构技术实践!
- mysql 虚拟表 分页_MySql大表分页(附独门秘技)
- java nio和io的区别_Java NIO和IO的区别
- 实验七 动态分区分配方式的模拟
- ajax日期格式,ajax读取的日期的格式转换
- 波形发生器c语言编程,C语言_源代码-波形发生器_程序清单.doc
- 修改build.prop文件,可更改新浪微博尾巴显示
- 与电影同行的日子(同步更新)
- HttpClient 4.2.3 (GA) 这些名字里面都有GA,GA代表什么意思啊?
- Android 开源交流 QQ 群分享汇总
- 高德地图 SDK 的应用 01:绘制多边形区域图
- mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)
- oracle ebs版本查看,Oracle EBS R12 - 如何取得EBS某个文件的版本号
- Win11 右键风格改为 Win10风格
- 更新查询能用计算机,小黑盒怎么更新电脑配置 查成绩方法