博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解PHP内核(八)变量及数据类型-预定义变量
阅读量:7115 次
发布时间:2019-06-28

本文共 1086 字,大约阅读时间需要 3 分钟。

原文链接:

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

转载地址:http://neghl.baihongyu.com/

你可能感兴趣的文章
在Ubuntu上搭建hive环境
查看>>
二分法查找
查看>>
hmac检验客户端合法性
查看>>
python-webbrowser模块 浏览器操作
查看>>
map侧连接
查看>>
数据库---数据库查询的各种子句
查看>>
vue+Mint-ui实现登录注册
查看>>
asp.net记住我功能
查看>>
[java web]Idea+maven+spring4+hibernate5+struts2整合过程
查看>>
Mybatis多参数
查看>>
[LibreOJ #2341]【WC2018】即时战略【交互】【LCT】
查看>>
【评分】BETA 版冲刺前准备
查看>>
scala快速一览
查看>>
二维码生成原理
查看>>
ARC机制
查看>>
完成登录与注册页面的前端
查看>>
Java二十三设计模式之------中介者模式
查看>>
电子商城实录------项目目录的结构搭建及其说明3
查看>>
wget命令详解
查看>>
note_简单的数据绑定
查看>>