创建这些变量是在 PHP 的内部、in main/php_variables.c
、 inphp_auto_globals_create_get()
和类似的函数中处理的。从 PHP 5.4.3 开始:
static zend_bool php_auto_globals_create_get(const char *name, uint name_len TSRMLS_DC)
{
zval *vars;
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) {
sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
vars = PG(http_globals)[TRACK_VARS_GET];
} else {
ALLOC_ZVAL(vars);
array_init(vars);
INIT_PZVAL(vars);
if (PG(http_globals)[TRACK_VARS_GET]) {
zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]);
}
PG(http_globals)[TRACK_VARS_GET] = vars;
}
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
Z_ADDREF_P(vars);
return 0; /* don't rearm */
}
这最终会直接调用 SAPI(例如,Apache 模块/CGI/FastCGI/其他)来获取变量。如果您处于一个奇怪的环境中,其中 GET/POST/etc 变量不是 PHP 所期望的,我认为没有任何方法可以改变它的工作方式。