深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--静态变量
2017-07-02 20:02 吃饱了才能撑着 阅读(39) 评论(0) 收藏 举报通常意义上静态变量是静态分配的,他们的生命周期和程序的生命周期一样,只有在程序退出时才结束其生命周期,这和局部变量相反,有的语言中全局变量也是静态分配的。例如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
总结:就是生命周期长了,然后还是挂到列表里面。而已了。
php初学者---千锋php课堂笔记
浙公网安备 33010602011771号