php之static静态变量详解
php之static静态变量详解
国内php空间⼀、总结
把局部变量改变为静态变量后是改变了它的存储⽅式,即改变了它的⽣存期。
把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。
⼆、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、静态局部变量适合多⽤么?
解答:局部静态变量占⽤内存时间较长,并且可读性差,因此,除⾮必要,尽量避免使⽤局部静态变量。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论