php内核 compile_global,PHP7内核-全局变量

PHP7内核-全局变量

2.4 全局变量

PHP中把定义在函数、类之外的变量称之为全局变量,也就是定义在主脚本中的变量,这些变量可以在函数、成员方法中通过global关键字引入使用。

function test() {

global $id;

$id++;

}

$id = 1;

test();

echo $id;

2.4.1 全局变量初始化

全局变量在整个请求执行期间始终存在,它们保存在EG(symbol_table)中,也就是全局变量符号表,与静态变量的存储一样,这也是一个哈希表,主脚本(或include、require)在zend_execute_ex执行开始之前会把当前作用域下的所有局部变量添加到EG(symbol_table)中,这一步操作后面介绍zend执行过程时还会讲到,这里先简单提下:

ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)

{

...

i_init_execute_data(execute_data, op_array, return_value);

zend_execute_ex(execute_data);

...

}

i_init_execute_data()这个函数中会把局部变量插入到EG(symbol_table):

ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data)

{

zend_op_array *op_array = &execute_data->func->op_array;

HashTable *ht = execute_data->symbol_table;

if (!EXPECTED(op_array->last_var)) {

return;

}

zend_string **str = op_array->vars;

zend_string **end = str + op_array->last_var;

//局部变量数组起始位置

zval *var = EX_VAR_NUM(0);

do{

zval *zv = zend_hash_find(ht, *str);

//插入全局变量符号表

zv = zend_hash_add_new(ht, *str, var);

//哈希表中value指向局部变量的zval

ZVAL_INDIRECT(zv, var);

...

}while(str != end);

}

从上面的过程可以很直观的看到,在执行前遍历局部变量,然后插入EG(symbol_table),EG(symbol_table)中的value直接指向局部变量的zval,示例经过这一步的处理之后(此时局部变量只是分配了zval,但还未初始化,所以是IS_UNDEF):

2.4.2 全局变量的访问

与静态变量的访问一样,全局变量也是将原来的值转换为引用,然后在global导入的作用域内创建一个局部变量指向该引用:

global $id; // 相当于:$id = & EG(symbol_table)["id"];

具体的操作过程不再细讲,与静态变量的处理过程一致,这时示例中局部变量与全局变量的引用情况如下图。

2.4.3 超全局变量

全局变量除了通过global引入外还有一类特殊的类型,它们不需要使用global引入而可以直接使用,这些全局变量称为:超全局变量。

超全局变量实际是PHP内核定义的一些全局变量:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION、argv、argc。

2.4.4 销毁

局部变量如果没有手动销毁,那么在函数执行结束时会将它们销毁,而全局变量则是在整个请求结束时才会销毁,即使是我们直接在PHP脚本中定义在函数外的那些变量。

void shutdown_destructors(void)

{

if (CG(unclean_shutdown)) {

EG(symbol_table).pDestructor = zend_unclean_zval_ptr_dtor;

}

zend_try {

uint32_t symbols;

do {

symbols = zend_hash_num_elements(&EG(symbol_table));

//销毁

zend_hash_reverse_apply(&EG(symbol_table), (apply_func_t) zval_call_destructor);

} while (symbols != zend_hash_num_elements(&EG(symbol_table)));

}

...

}

PHP7内核-全局变量 相关文章

PHP7内核-词法解析 语法解析

词法解析、语法解析 这一节我们分析下PHP的解析阶段,即PHP代码-抽象语法树(AST)的过程。 PHP使用re2c、bison完成这个阶段的工作: re2c:词法分析器,将输入分割为一个个有意义的词块,称为token bison:语法分析器,确定词法分析器分割出的token是如何彼此关

PHP7内核-Zend虚拟机-PHP代码的编译

PHP代码的编译 PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一个普通的C程序,它有main函数,我们写的PHP代码是这个程序的输入,然后经过内核的处理输出结果,内核将PHP代码"翻译"为C程序可识别的过程就是PHP的编译。 那么这个"翻译"过程具体都

避免全局变量漫天飞

先谈谈全局变量的特点 全局变量(Global Variables) :在计算机编程语言中,所谓全局变量是指具有全局作用域的变量,这意味着它在整个程序中是可见的,因此是可访问的。所谓可访问,是指全局可读、全局可写。在编译语言中,全局变量通常是静态变量,其范围(

axios设置全局headers

需求:每次请求的时候都设置token为headers非常不方便 axios提供配置全局headers 这里我主要使用的是加 一个token验证 Global axios defaults axios.defaults.baseURL = 'https://api.example.com'; // Important:如果axios与多个域一起使用,那么AUTH_TOKEN

如何查看Linux内核输出的调试信息

第一点需要澄清:我使用的环境是嵌入式Linux,并非桌面版Linux,查看内核输出的调试信息也是为了追踪内核子系统的运行。这可能是一个非常小的知识点,但是还是希望自己记录一些东西,以后也好拾起。 本文分为两点: 如何打开内核中底层的调试信息输出 如何查

TCP/IP 协议栈在Linux内核中的运行时序分析

调研要求 在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。 编译、部署、运行、测评、原理、源代码分析、跟踪调试等 应该包括时序

dpdk环境配置

大页内存 在内核启动参数中配置大页的大小和个数,以Ubuntu为例: default_hugepagesz=1G hugepagesz=1G hugepages=1设置到/etc/default/grub中的GRUB_CMDLINE_LINUX中,然后运行update-grub更新启动参数配置文件 /boot/grub/grub.cfg。之后重新启动,cat /p

586 Node.js系列二 - Node基础知识: JavaScript文件执行,Node的REPL,给node程序传递参数,node程序输出内容,常见全局对象,特殊的全局对象

一. Node执行代码 1.1. JavaScript文件执行 如果我们编写一个js文件,里面存放JavaScript代码,如何来执行它呢 // 1.直接打印一段文字console.log("我是一段JavaScript代码");// 2.定义一个函数, 调用这个函数function sum(num1, num2) { return num1 + num2

BootStrap:入门案例、全局CSS样式

今日内容 1. Bootstrap Bootstrap: 1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。* 框架:一个半成品软件,开发人员可以在框架基础

参数校验特性的改进(全局注册及跳过校验)

前言 改进一下ParaModelValidateAttribute(参数校验) 1.在StartUp中对参数校验特性进行全局配置 2.添加一个跳过校验特性 3.修改ParaModelValidateAttribute 4.在需要跳过校验的方法上添加跳过校验特性 代码实现 在StartUp中对参数校验特性进行全局配置 pub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值