静态变量

Posted 尼农小道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态变量相关的知识,希望对你有一定的参考价值。

静态变量

    在函数体内使用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、函数调用结束:

图解:

以上是关于静态变量的主要内容,如果未能解决你的问题,请参考以下文章

c#静态变量和非静态变量的区别

关于静态变量和非静态变量的区别

什么是静态变量?

java基础(static---静态方法和静态变量以及静态方法)

lua脚本有静态局部变量吗

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销