Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

global语句的作用是定义全局变量,例如如果想在函数内访问全局作用域内的变量则可以通过global声明来定义。 下面从语法解释开始分析。7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

1. 词法解析

查看 Zend/zend_language_scanner.l文件,搜索 global关键字。我们可以找到如下具体代码如下:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<ST_IN_SCRIPTING>"global" {
return T_GLOBAL;
}

2. 语法解析

在词法解析完后,获得了token,此时通过这个token,我们去Zend/zend_language_parser.y文件中查找。找到相关具体代码如下如下:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

|   T_GLOBAL global_var_list ';'
 
global_var_list:
    global_var_list ',' global_var  { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCh_GLOBAL_LOCK TSRMLS_CC); }
|   global_var                      { zend_do_fetch_global_variable(&$1, NULL, ZEND_FETCh_GLOBAL_LOCK TSRMLS_CC); }
;

上面具体代码如下中的$3是指global_var(如果不清楚yacc的语法,可以查阅yacc入门类的文章。)7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

从上面的具体代码如下可以知道,对于全局变量的声明调用的是zend_do_fetch_global_variable函数,查找此函数的实现在Zend/zend_compile.c文件。7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

void zend_do_fetch_global_variable(znode *varname, const znode *static_assignment, int fetch_type TSRMLS_DC) 
{
        ...//省略
        opline->opcode = ZEND_FETCh_W;      /* the default mode must be Write, since fetch_simple_variable() is used to define function arguments */
        opline->result.op_type = IS_VAR;
        opline->result.u.EA.type = 0;
        opline->result.u.var = get_temporary_variable(CG(active_op_array));
        opline->op1 = *varname;
        SET_UNUSED(opline->op2);
        opline->op2.u.EA.type = fetch_type;
        result = opline->result;
 
        ... // 省略
        fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */
 
        zend_do_assign_ref(NULL, &lval, &result TSRMLS_CC);
        CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED;
}
/* }}} */

上面的具体代码如下确认了opcode为ZEND_FETCh_W外,还执行了zend_do_assign_ref函数。zend_do_assign_ref函数的实现如下:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRMLS_DC) /* {{{ */
{
        zend_op *opline;
 
       ... //省略
 
        opline = get_next_op(CG(active_op_array) TSRMLS_CC);
        opline->opcode = ZEND_ASSIGN_REF;
       ...//省略
        if (result) {
                opline->result.op_type = IS_VAR;
                opline->result.u.EA.type = 0;
                opline->result.u.var = get_temporary_variable(CG(active_op_array));
                *result = opline->result;
        } else {
                /* SET_UNUSED(opline->result); */
                opline->result.u.EA.type |= EXT_TYPE_UNUSED;
        }
        opline->op1 = *lvar;
        opline->op2 = *rvar;
}

从上面的zend_do_fetch_global_variable函数和zend_do_assign_ref函数的实现可以看出, 使用global声明一个全局变量后,其执行了两步操作,ZEND_FETCh_W和ZEND_ASSIGN_REF。7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

3. 生成并执行中间具体代码如下

我们看下ZEND_FETCh_W的最后执行。从具体代码如下中我们可以知道:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

ZEND_FETCh_W = 837NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

op->op1.op_type = 47NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

op->op2.op_type = 07NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

而计算最后调用的方法在具体代码如下中的体现为:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

zend_opcode_handlers[opcode * 25   zend_vm_decode[op->op1.op_type] * 5   zend_vm_decode[op->op2.op_type]];

计算,最后调用ZEND_FETCh_W_SPEC_CV_hANDLER函数。即7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

static int ZEND_FASTCALL  ZEND_FETCh_W_SPEC_CV_hANDLER(ZEND_OPCODE_hANDLER_ARGS)
{
	return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_W, ZEND_OPCODE_hANDLER_ARGS_PASSThRU);
}

在zend_fetch_var_address_helper_SPEC_CV中调用如下具体代码如下获取符号表7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);

在zend_get_target_symbol_table函数的实现如下:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

static inline hashTable *zend_get_target_symbol_table(const zend_op *opline, const temp_variable *Ts, int type, const zval *variable TSRMLS_DC)
{
        switch (opline->op2.u.EA.type) {
                ... //  省略
                case ZEND_FETCh_GLOBAL:
                case ZEND_FETCh_GLOBAL_LOCK:
                        return &EG(symbol_table);
                        break;
               ...  //  省略
        }
        return NULL;
}

在前面语法分析过程中,程序传递的参数是 ZEND_FETCh_GLOBAL_LOCK,于是如上所示。我们取&EG(symbol_table);的值。这也是全局变量的存放位置。7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

如上就是整个global的解析过程。7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

PhP程序内核探索:变量类型的转换7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

隐式类型转换也被称为自动类型转换,是指不需要程序员书写具体代码如下,由编程语言自动完成的类型转换。 在PhP程序中,我们经常遇到的隐式转换有:7NBAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,全局变量Global

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市