PHP中做用域的實現原理

每種程序語言都有本身的做用域實現,php的做用域是怎麼實現的呢?
先看一段php代碼。php

$bar = "out";

function scope(){
    $bar = "inner";
    echo $bar."<\n>";
}

scope();

這段代碼的輸出很簡單:編程

root@forse:~/learn$ php a.php 
inner

爲何會是這樣的輸出,我相信只要稍微懂點php或者編程的人就明白。那在php底層是怎麼實現這樣的效果的?
Zend引擎自己有_zend_executor_globals結構,該結構中的symptom_table是全局符號表,其中保存了頂層做用域的變量也就是全局變量。但程序須要使用全局變量的時候舊在這個符號表中遍歷。
那局部變量呢?其實每一個函數都有一個本身的符號表activity_symptom_table。每一個函數的符號表都是相互獨立的。
在php中,執行環境是在_zend_execute_data中,在執行某個函數時,全局中的_zend_executor_globals中的activity_symptom_table指向當前的_zend_execte_data中的symptom_table,之後全部函數執行過程當中的變量修改都是在新的symptom_table中修改,不會影響全局的變量,也讀不到全局的變量,但函數執行完成後,php在將原來的execute_data恢復,恢復到全局變量,這樣就實現了全局變量和局部變量的互換。函數

相關文章
相關標籤/搜索