global语句global语句的作用是定义全局变量, 例如如果想在函数内访问全局作用域内的变量则可以通过global声明来定义。下面从语法解释开始分析. 1. 词法解析查看 Z......
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。
3. 生成并执行中间代码
我们看下ZEND_FETCH_W的最后执行。从代码中我们可以知道:
ZEND_FETCH_W = 83 op->op1.op_type = 4 op->op2.op_type = 0 而计算最后调用的方法在代码中的体现为:
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函数。即
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中调用如下代码获取符号表
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);在zend_get_target_symbol_table函数的实现如下:
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);的值。这也是全局变量的存放位置。
如上就是整个global的解析过程。
2/2 首页 上一页 1 2 |