通常意义上静态变量是静态分配的,他们的生命周期和程序的生命周期一样,只有在程序退出时才结束其生命周期,这和局部变量相反,有的语言中全局变量也是静态分配的。例如PHP和javascript中的全局变量。
静态变量可以分为:
静态全局变量,PHP中的全局变量也可以理解为静态全局变量,因为除非明确unset释放,在程序运行中始终存在。
静态局部变量,也就是在函数内定义的静态变量,函数在执行时对变量的操作会保持到下一次函数被调用
静态成员变量,这是在类中定义的静态变量,和实例变量相对应,静态成员变量可以在所有实例中共享。
最常见的是静态局部变量及静态成员变量。局部变量只有在函数执行时才会存在,通常,当一个函数执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有具备变量将重新初始化。如果某个具备变量定义为静态的,则它的值不会在函数调用结束后释放,而是继续保留变量的值。
<?php
function t(){
static $i = 0;
$i++;
echo $i,' ';
}
t();
t();
t();
词法分析
<ST_IN_SCRIPTING>"static"{
return T_STATIC;
}
语法分析
在词法分析找到token后,通过这个token,在Zend/zend_language_parser.y文件中查找。
生成opcode中间代码
zend_do_fetch_static_variable函数的作用就是生成opcode。
从上面的代码我们可知,在解释成中间代码时,静态变量是存放在CG(active_op_array)->static_variables中的。并且生成的中间代码为:ZEND_FETCH_W 和 ZEND_ASSIGN_REF
执行中间代码
opcode的编译阶段完成后就开始opcode的执行了,在Zend/zend_vm_opcodes.h文件中包含所有opcode的宏定义,这些宏并没有特殊含义,只是作为opcode的唯一标示,包含本例中相关的如下两个宏的定义:
#define ZEND_FETCH_W 83
#define ZEND_ASSIGN_REF 39
总结:就是生命周期长了,然后还是挂到列表里面。而已了。