静态变量
在函数体内使用static定义的变量
语法:
static $vName =值;
说明:
- 静态变量在函数调用时只会被初始化一次。
- 静态变量不会随函数调用与结束,而消失,但是在函数外部无访问。
- 每次在函数调用时,仍然保留着上次函数运行时的值,而且可以使用
- 静态变量的值只能是简单的值,不能是一个式子
- 当我们想在函数多次调用时,每次还有使用上一次函数调用时候的值,那么可以考虑使用静态变量。
静态变量的内存原理
源代码:
<?php
function funTest(){
static $v1 = 100;
$v2 = 100;
$v1 ++;
$v2 ++;
echo "<font color='red'>".$v1.'</font><br/>';
echo $v2.'<hr/>';
}
funTest();
funTest();
?>
原理描述:
1、编译,加载源代码,词法检查,语法检查(可执行机器代码)
1.1、在编译时发现函数内用static关键字,那就会在静态区开辟一个空间用于存储数据100
2、执行函数调用
2.1、检查是否有形参存在(没有),
2.2、在栈区开辟一个空间用于存储函数的执行(为函数开辟的专属的空间)
2.3、在栈区开辟一个空间用于存储$v1,由于是staitc声明的,把会在静态区存储100数据的物理地址,传递栈区$v1
3、$v2 = 100;
3.1、会在栈区专属于函数空间内开辟一个空间存储$v2,
3.2、在全局区开辟一个空间用于存储100数据,
3.3、将全局区存储100数据的物理地址赋值给$v2。
4、执行$v1++
4.1、根据栈区中$v1的内存地,找到静态区中的内存空间,并将数据加1
5、执行$v2++
5.1、根据栈区中$v1的内存地,找到静态区中的内存空间,并将数据加1
6、执行echo $v1与echo $v2
7、函数调用结束:
8、第二次调用
8.1、static $v1 = 100在编译时已被执行,在函数调用时不会再执行初始化,但仍然在函数专的内存区域,开辟空间存储$v1
8.2、将静态区中的101的物理地址,传递栈区中的$v1
9、执行$v2 = 100,(步骤如:3.1 3.2 3.3)
10、执行$v1++
10.1、根据栈区中$v1的内存地,找到静态区中的内存空间,并将数据加1
11、执行$v2++
11.1、根据栈区中$v1的内存地,找到静态区中的内存空间,并将数据加1
12、执行echo $v1与echo $v2
13、函数调用结束:
图解: