static zend_always_inline zval **_get_zval_ptr_ptr_cv(const znode *node, const temp_variable *Ts, int type TSRMLS_DC)
{
zval ***ptr = &CV_OF(node->u.var);
if (UNEXPECTED(*ptr == NULL)) {
return _get_zval_cv_lookup(ptr, node->u.var, type TSRMLS_CC);
}
return *ptr;
}
// 函数中的CV_OF宏定义
#define CV_OF(i) (EG(current_execute_data)->CVs[i])
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts),
BP_VAR_IS, varname TSRMLS_CC);
if (zend_hash_quick_del(target_symbol_table, varname->value.str.val,
varname->value.str.len+1, hash_value) == SUCCESS) { // 删除HashTable元素
zend_execute_data *ex = execute_data;
do {
int i;
if (ex->op_array) {
for (i = 0; i < ex->op_array->last_var; i++) {
if (ex->op_array->vars[i].hash_value == hash_value &&
ex->op_array->vars[i].name_len == varname->value.str.len &&
!memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
ex->CVs[i] = NULL; // 置空EX(CVs)
break;
}
}
}
ex = ex->prev_execute_data;
} while (ex && ex->symbol_table == target_symbol_table);
}
http://www.php-internals.com/book/?p=chapt03/03-06-01-var-define-and-init