zoukankan      html  css  js  c++  java
  • 深入理解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函数的代码可参考原文)

  • 相关阅读:
    POJ 2653 Pick-up sticks [线段相交 迷之暴力]
    POJ1556 The Doors [线段相交 DP]
    POJ 3304 Segments[直线与线段相交]
    POJ2318 TOYS[叉积 二分]
    挖坑
    HDU3488 Tour [有向环覆盖 费用流]
    BZOJ 3438: 小M的作物 [最小割]
    POJ 2125 Destroying The Graph [最小割 打印方案]
    网络流算法与建模总结
    CF266D. BerDonalds [图的绝对中心]
  • 原文地址:https://www.cnblogs.com/orlion/p/5344139.html
Copyright © 2011-2022 走看看