Rumah  >  Artikel  >  pembangunan bahagian belakang  >  static静态局部变量和静态全局变量的区别详解

static静态局部变量和静态全局变量的区别详解

伊谢尔伦
伊谢尔伦asal
2017-05-08 10:56:3915166semak imbas

局部变量从存储方式上可分为动态存储类型和静态存储类型。函数中的局部变量,如不专门声明为 static 存储类别,默认都是动态地分配存储空间。其中的内部动态变量在函数调用结束后自动释放。如果希望在函数执行后,其内部变量依然保存在内存中,应当使用静态变量。在函数执行完毕以后,静态变量并不会消失,而是在所有对该函数的调用之间共享,即在函数再次执行时,静态变量将连续前次的结果继续运算,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的,需要使用关键字 static

前面我们介绍了php变量的范围之局部变量php变量的范围之全局变量。静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

一、静态局部变量:

1、static类型的内部变量同auto自动变量(即未加 static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,两者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。

2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。

4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(主要是变量的作用域造问题成的),因此仍以采用局部静态变量为宜。

注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

二、静态全局变量

全局变量(外部变量)的声明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。

static静态局部变量和静态全局变量区别

这两者的区别虽在于:

1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

从以上分析可以看出————

把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。

把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量堆变量的区别。

示例代码如下所示:

<?php
//--------------如何理解static静态变量-----------
 
/** 普通局部变量 */
function local() {
    $loc = 0; //这样,如果直接不给初值0是错误的。
    ++$loc;
    echo $loc . &#39;<br>&#39;;
}
local(); //1
local(); //1
local(); //1
echo &#39;===================================<br/>&#39;;
 
/** static静态局部变量 */
function static_local() {
    static $local = 0 ; //此处可以不赋0值
    $local++;
    echo $local . &#39;<br>&#39;;
}
static_local(); //1
static_local(); //2
static_local(); //3
//echo $local; 注意虽然静态变量,但是它仍然是局部的,在外不能直接访问的。
echo &#39;=======================================<br>&#39;;
 
/** static静态全局变量(实际上:全局变量本身就是静态存储方式,所有的全局变量都是静态变量) */
function static_global() {
    global $glo; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
    $glo++;
    echo $glo . &#39;<br>&#39;;
}
static_global(); //1
static_global(); //2
static_global(); //3
?>

以上就是static静态局部变量和静态全局变量详解。

【相关教程推荐】

1. 《php.cn独孤九贱(4)-php视频教程

2.  php编程从入门到精通全套视频教程

3.  php实战视频教程

Atas ialah kandungan terperinci static静态局部变量和静态全局变量的区别详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn