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

深入理解PHP内核(八)变量及数据类型-预定义变量的更多相关文章

  1. Shell 变量详解教程之位置变量与预定义变量。

    Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...

  2. $_ENV和$GLOBALS预定义变量

    1,$_ENV该全局数组可以获取环境变量,在php5.3中默认禁用,但是可以在php.ini中启用. variables_order="EGPCS" 2,$GLOBALS一个包含了 ...

  3. Shell 变量详解教程之位置变量与预定义变量

    Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一.   自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...

  4. 『忘了再学』Shell基础 — 17、预定义变量

    目录 1.预定义变量$? 2.预定义变量$$和$! 我们之前说过,Shell中的变量不是按照变量值的类型来进行分类的,而是按照Linux系统中定义的变量类别来分类的. 预定义变量就是,事先把变量的名称 ...

  5. 小鸟初学Shell编程(八)环境变量、预定义变量与位置变量

    环境变量 环境变量:每个Shell打开都可以获得到的变量. 我们知道通过export的方式打开可以让子进程读取父进程的变量的值,那怎么样才能让每一个进程都能读取到变量的值呢? 在这呢,系统有一些默认的 ...

  6. 6)PHP,预定义变量

    预定义变量也叫超全局变量: :预定义变量又叫超全局变量,包括: $_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_COOKIE, $_SESSION, . ...

  7. PHP预定义变量

    * PHP预定义 * 预定义变量 * $_GET - 接收客户端以请求类型为GET方法发送的数据内容 * $_POST - 接收客户端以请求类型为POST方法发送的数据内容 * $_REQUEST - ...

  8. linux中位置参数变量和预定义变量

    位置参数变量   预定义变量

  9. Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1

    Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1.1.1       C++内建变量(__LINE__).... 1.1.2       ...

随机推荐

  1. Firebird数据库系统的开发团队

    下载Firebird3的发布文档,上面列出了开发团队,仔细看了看,原来俄罗斯人是主导(内核开发),法国人.智利人.巴西人.日本人.荷兰人.捷克人都有.共17人,3人全职. able 13.1. Fir ...

  2. smartupload 上传与下载(转载)

    前台: <form action="uploadimage.jsp" method="post" enctype="multipart/form ...

  3. 随笔SublimeText Theme安装

    2015-12-31日记 在更换SublimeText颜色的时候没有及时的备份这个文件.导致浪费了半个 小时来处理这个问题 处理问题需要冷静歘平慢一些, 关键在于不出错. 当时有一个想法就是这个东西不 ...

  4. alfresco install in linux, and integrated with tesseract ocr

    本文描述在Linux系统上安装Alfresco的步骤: 1. 下载安装文件:alfresco-community-5.0.d-installer-linux-x64.bin 2. 增加执行权限并执行: ...

  5. chrome 问题

    1.chrome表单自动填充去掉input黄色背景解决方案 http://blog.csdn.net/wangxiaohui6687/article/details/10149579 2.chrome ...

  6. Linux tcpdump 详解

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  7. poj 1286&&poj2409 Polya计数 颜色匹配

    #include <iostream> #include <math.h> using namespace std; #define LL long long LL gcd(L ...

  8. linux-12基本命令之 cat,more,head, tail ,tr,od,wc,cut,diff

    1.cat 命令 用于查看纯文本文件(较短),格式:"cat[选项][文件]" 查看文本文件 [root@localhost /]# cat 文件名 cat 参数 参数 作用 -n ...

  9. java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器

    java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...

  10. Restful.Data v2.0发布,谢谢你们的支持和鼓励

    v1.0发布后,承蒙各位博友们的热心关注,也给我不少意见和建议,在此我真诚的感谢 @冰麟轻武 等朋友,你们的支持和鼓励,是这个开源项目最大的推动力. v2.0在除了细枝末节外,在功能上主要做了一下更新 ...