深入理解PHP內核(八)變量及數據類型-預定義變量 -开发者知识库

深入理解PHP內核(八)變量及數據類型-預定義變量 -开发者知识库,第1张

原文鏈接:http://www.orlion.ga/249/

PHP腳本在執行的時候用戶全局變量(在用戶空間顯示定義的變量)會保存在一個HashTable數據類型的符號表中(symbol_table)中,在PHP中有一些比較特殊的全局變量例如:$_GET、$_POST、$_SERVER等變量,我們並沒有在程序中定義這些變量,並且這些變量也同樣保存在符號表中,PHP是在腳本運行之前就將這些特殊的變量加入到了符號表中了。

 

一、預定義變量$GLOBALS的初始化

    我們以cgi模式為例說明$GLOBALS的初始化。從cgi_main.c文件main函數開始。整個調用順序如下所示:

main()-> php_request_startup() -> zend_activate() -> init_executor()

... // 省略
zend_hash_init(&EG(symbol_table), 50, NULL, ZVAL_PTR_DTOR, 0);
{
    zval *globals;
 
    ALLOC_ZVAL(globals);
    Z_SET_REFCOUNT_P(globals, 1);
    Z_SET_ISREF_P(globals);
    Z_TYPE_P(globals) = IS_ARRAY;
    Z_ARRVAL_P(globals) = &EG(symbol_table);
    zend_hash_update(&EG(symbol_table), "GLOBALS", sizeof("GLOBALS"),
        &globals, sizeof(zval *), NULL);      // 添加全局變量GLOBALS
}
... // 省略

    上面的代碼得關鍵點zend_hash_update函數的調用,它將變量名為GLOBALS的變量注冊到EG(symbol_table)中,EG(symbol_table)是一個HashTable的結構,用來存放所有的全局變量

 

二、$_GET、$_POST等變量的初始化
    

    $_GET、$_COOKIE、$_SERVER、$_ENV、$_FILES、$_POST(原文是$_REQUEST,但是好像不對)這六個變量都是通過如下的調用序列進行初始化【main()->php_request_startup() -> php_hash_environment()】在請求初始化時,通過調用php_hash_environment函數初始化以上的六個預定義的變量。(php_hash_environment函數的代碼可參考原文)

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复