PHP深入理解PHP内核(八)变量和数据类型-预定义变量

初稿链接: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函数的代码可参考原文)

相关文章