$_SERVER 本身有什么作用?
What does $_SERVER on its own do?
我遇到过以下三行代码:
$_SERVER;
$_ENV;
$_REQUEST;
对我来说,这三行代码似乎什么也没做。它们不会导致任何错误。
我知道这三个全局变量是什么,就是不知道这三行代码是干什么的。谁能赐教一下?
整个文件 - 如果相关:
<?PHP
function register_global_array( $sg ) {
Static $superGlobals = array(
'e' => '_ENV' ,
'g' => '_GET' ,
'p' => '_POST' ,
'c' => '_COOKIE' ,
'r' => '_REQUEST' ,
's' => '_SERVER' ,
'f' => '_FILES'
);
Global ${$superGlobals[$sg]};
foreach( ${$superGlobals[$sg]} as $key => $val ) {
$GLOBALS[$key] = $val;
}
}
function register_globals( $order = 'gpc' ) {
$_SERVER; //See Note Below
$_ENV;
$_REQUEST;
$order = str_split( strtolower( $order ) );
array_map( 'register_global_array' , $order );
}
register_globals('GPCFRES');
?>
不,下面没有任何注释。
它们显然做了一些事情,因为如果我删除它们,那么 foreach 行就会出错。
我不确定你的问题是否使用了正确的动词。 $_SERVER 是一个变量。 Variables 是值的容器,它们 "do" 什么都没有。 $GLOBALS 变量是变量中数组值的根。 $_SERVER 变量和其他变量 match/map 作为此数组中的键。 运行 print_r 或 var_dump 会让您更多地了解它的结构
<?php echo '<pre>'. print_r($GLOBALS,1) . '</pre>'; ?>
给出:
Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[_ENV] => Array
(
)
[_REQUEST] => Array
(
)
[_SERVER] => Array
(
[HTTP_HOST] => fhqk.com
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
[SERVER_SIGNATURE] => Apache/2.2.15 (CentOS) Server at fhqk.com Port 80
[SERVER_SOFTWARE] => Apache/2.2.15 (CentOS)
[SERVER_NAME] => fhqk.com
[SERVER_ADDR] => 144.76.244.51
[SERVER_PORT] => 80
[REMOTE_ADDR] => 77.12.152.125
[DOCUMENT_ROOT] => /var/vhosts/fhqk.com/www
[SERVER_ADMIN] => root@localhost
[SCRIPT_FILENAME] => /var/vhosts/fhqk.com/www/informationtechnology/movico/index.php
[REMOTE_PORT] => 16183
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /informationtechnology/movico/
[SCRIPT_NAME] => /informationtechnology/movico/index.php
[PHP_SELF] => /informationtechnology/movico/index.php
[REQUEST_TIME_FLOAT] => 1428950219.959
[REQUEST_TIME] => 1428950219
)
[GLOBALS] => Array
*RECURSION*
)
更新:我刚刚阅读了您 post 中的代码并闪回了 php 版本 3。注册超级全局变量在过去很常见。这不是现代 PHP 所做的事情。我建议删除此代码并重构以修复由此产生的任何错误。注册 Super globals,无论它们是你的还是其他的,都会导致一些令人讨厌的安全性。如果处理不当就会出现缺陷。 register_globals 已弃用。
我遇到过以下三行代码:
$_SERVER;
$_ENV;
$_REQUEST;
对我来说,这三行代码似乎什么也没做。它们不会导致任何错误。
我知道这三个全局变量是什么,就是不知道这三行代码是干什么的。谁能赐教一下?
整个文件 - 如果相关:
<?PHP
function register_global_array( $sg ) {
Static $superGlobals = array(
'e' => '_ENV' ,
'g' => '_GET' ,
'p' => '_POST' ,
'c' => '_COOKIE' ,
'r' => '_REQUEST' ,
's' => '_SERVER' ,
'f' => '_FILES'
);
Global ${$superGlobals[$sg]};
foreach( ${$superGlobals[$sg]} as $key => $val ) {
$GLOBALS[$key] = $val;
}
}
function register_globals( $order = 'gpc' ) {
$_SERVER; //See Note Below
$_ENV;
$_REQUEST;
$order = str_split( strtolower( $order ) );
array_map( 'register_global_array' , $order );
}
register_globals('GPCFRES');
?>
不,下面没有任何注释。
它们显然做了一些事情,因为如果我删除它们,那么 foreach 行就会出错。
我不确定你的问题是否使用了正确的动词。 $_SERVER 是一个变量。 Variables 是值的容器,它们 "do" 什么都没有。 $GLOBALS 变量是变量中数组值的根。 $_SERVER 变量和其他变量 match/map 作为此数组中的键。 运行 print_r 或 var_dump 会让您更多地了解它的结构
<?php echo '<pre>'. print_r($GLOBALS,1) . '</pre>'; ?>
给出:
Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[_ENV] => Array
(
)
[_REQUEST] => Array
(
)
[_SERVER] => Array
(
[HTTP_HOST] => fhqk.com
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
[SERVER_SIGNATURE] => Apache/2.2.15 (CentOS) Server at fhqk.com Port 80
[SERVER_SOFTWARE] => Apache/2.2.15 (CentOS)
[SERVER_NAME] => fhqk.com
[SERVER_ADDR] => 144.76.244.51
[SERVER_PORT] => 80
[REMOTE_ADDR] => 77.12.152.125
[DOCUMENT_ROOT] => /var/vhosts/fhqk.com/www
[SERVER_ADMIN] => root@localhost
[SCRIPT_FILENAME] => /var/vhosts/fhqk.com/www/informationtechnology/movico/index.php
[REMOTE_PORT] => 16183
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /informationtechnology/movico/
[SCRIPT_NAME] => /informationtechnology/movico/index.php
[PHP_SELF] => /informationtechnology/movico/index.php
[REQUEST_TIME_FLOAT] => 1428950219.959
[REQUEST_TIME] => 1428950219
)
[GLOBALS] => Array
*RECURSION*
)
更新:我刚刚阅读了您 post 中的代码并闪回了 php 版本 3。注册超级全局变量在过去很常见。这不是现代 PHP 所做的事情。我建议删除此代码并重构以修复由此产生的任何错误。注册 Super globals,无论它们是你的还是其他的,都会导致一些令人讨厌的安全性。如果处理不当就会出现缺陷。 register_globals 已弃用。