创建这些变量是在 PHP 的内脏中深入处理的,在 和 类似函数中。从 PHP 5.4.3 开始:main/php_variables.c
php_auto_globals_create_get()
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 / whatever)来获取变量。我不认为有任何方法可以改变它的工作方式,如果你处于一个奇怪的环境中,GET/POST/etc变量不是PHP期望它们的位置。