PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。
静态变量既然不会随执行的结束而释放,那么很容易想到它的保存位置:zend_op_array->static_variables
,这是一个哈希表,所以PHP中的静态变量与普通局部变量不同,它们没有分配在执行空间zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。
静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段。这个特性也意味着静态变量初始的值不能是变量,比如:static $count = $xxx;
这样定义将会报错。因为编译的时候zend_execute_data还不存在,zend_execute_data在执行之初分配,然后在执行结束时释放。