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

本文共 1136 字,大约阅读时间需要 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函数的代码可参考原文)

转载于:https://www.cnblogs.com/orlion/p/5344139.html

你可能感兴趣的文章
我的友情链接
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
javascript继承方式详解
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
python模块--os模块
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
学习进度表 04
查看>>
谈谈javascript中的prototype与继承
查看>>
时序约束优先级_Vivado工程经验与各种时序约束技巧分享
查看>>
minio 并发数_MinIO 参数解析与限制
查看>>
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>