本文介绍PHP的各种变量,全局静态变量、全局变量、局部静态变量、局部变量

全局变量/局部变量也即是全局动态变量/局部动态变量=全局普通变量/局部普通变量=外部变量/内部变量

实际上,全局变量(也即全局动态变量/全局普通变量)本身就是静态存储方式,所以全局静态变量也是静态存储方式。全局变量和静态变量都是存储在同一个地方。于是所有全局变量也是静态变量。

静态变量不可以赋表达式,只可以赋常量或者常量表达式,如果定义时没有初始化,系统会自动初始化为0(int)或者’’(空string)。也即可以定义时不进行初始化。
普通变量一定要初始化,如果不进行初始化,那么在定义时它的值是不确定的

全局变量/全局动态变量

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

全局静态变量

全局静态变量则限制了其作用域,只在定义该变量的源文件内有效,在同一源程序(一个源程序由多个源文件组成)的其它源文件中不能使用它。要定义/声明全局静态变量(外部静态变量)可以在前面加上static关键字

局部变量/局部动态变量

凡是局部变量(无论是普通变量还是静态变量)的作用域都是局限与某个小区域内(如函数),普通变量在每次函数调用完后,存储的内容都会消失(实际上不一定,这涉及到php的底层内核原理)

局部静态变量

局部静态变量的作用域也是局限与某个小区域(如函数),不同的只是函数每次调用结束后,变量的值不会丢失而是依然存在,在下次函数被调用时,该可以从该静态变量获取之前的值。

总结

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

代码演示

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
37
<?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 就是引用外部的全局变量
global $glo; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
$glo++;
echo $glo . '<br>';
}
static_global(); //1
static_global(); //2
static_global(); //3
?>

本文参考:http://hao.jser.com/archive/7370/
【php官方手册】