PHP中局部變量分配在zend_execute_data結構上,每次執行zend_op_array都會生成一個新的zend_execute_data,局部變量在執行之初分配,而後在執行結束時釋放,這是局部變量的生命週期,而局部變量中有一種特殊的類型:靜態變量,它們不會在函數執行完後釋放,當程序執行離開函數域時靜態變量的值被保留下來,下次執行時仍然可使用以前的值。函數
靜態變量既然不會隨執行的結束而釋放,那麼很容易想到它的保存位置:zend_op_array->static_variables
,這是一個哈希表,因此PHP中的靜態變量與普通局部變量不一樣,它們沒有分配在執行空間zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。code
靜態變量只會初始化一次,注意:它的初始化發生在編譯階段而不是執行階段。這個特性也意味着靜態變量初始的值不能是變量,好比:static $count = $xxx;
這樣定義將會報錯。由於編譯的時候zend_execute_data還不存在,zend_execute_data在執行之初分配,而後在執行結束時釋放。生命週期