1.局部变量spa
PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,而后在执行结束时释放,这是局部变量的生命周期。
读写操做:局部变量经过编译时肯定的编号进行读写操做
2.静态变量code
静态变量的保存位置:zend_op_array->static_variables,这是一个哈希表,因此PHP中的静态变量与普通局部变量不一样,它们没有分配在执行空间zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段,这个特性也意味着静态变量初始的值不能是变量,好比:static $count = $xxx;这样定义将会报错
读写操做:首先根据变量名在static_variables中取出对应的zval,而后将它修改成引用类型并赋值给局部变量,也就是说static $count = 4;包含了两个操做,严格的将$count并非真正的静态变量,它只是一个指向静态变量的局部变量,执行时实际操做是:$count = & static_variables["count"];
3.全局变量生命周期
全局变量在整个请求执行期间始终存在,它们保存在EG( executor_globals,Zend执行器相关的全局变量)的symbol_table中,与静态变量的存储同样,这也是一个哈希表,在zend_execute_ex执行开始以前会把当前做用域下的全部全局变量添加到EG的symbol_table中.
读写操做:与静态变量的访问同样,全局变量也是将原来的值转换为引用,而后在global导入的做用域内建立一个局部变量指向该引用
4.常量图片
常量存储在EG的zend_constants哈希表中,访问时也是根据常量名直接到哈希表中查找
typedef struct _zend_constant { zval value; //常量值 zend_string *name; //常量名 } zend_constant;