• 深入理解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函数的代码可参考原文)

  • 相关阅读:
    windows下编译Boost库
    linux下编译Boost库
    CEPH安装教程(下)
    CEPH安装教程(中)
    CEPH安装教程(上)
    nfs使用教程
    iscsi使用教程(下)
    POJ-2096 Collecting Bugs 概率dp
    HDU-3586 Information Disturbing 树形dp+二分
    HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
  • 原文地址:https://www.cnblogs.com/orlion/p/5344139.html
Copyright © 2020-2023  润新知