【问题标题】:What does $_SERVER on its own do?$_SERVER 自己做什么?
【发布时间】:2015-06-18 20:02:57
【问题描述】:

我遇到过以下三行代码:

$_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 行就会出错。

【问题讨论】:

  • NOOP 这么简单
  • 那么为什么三个不同的变量要做noop 3次呢?
  • 除非使用这些变量,否则它们不会被注册。如果您在使用$_SERVER 之前尝试使用$_GLOBALS['_SERVER'],它将返回null。
  • @Graham:我认为他们初始化了变量。一些 php 引擎可能会等待将变量的创建推迟到需要它们的位置。但也许这种机制在使用${$SuperGlobals...} 时不起作用。
  • 抱歉,确实是$GLOBALS,而不是$_GLOBALS。我现在找不到它,但 php.net 上某处有一条评论解释说有时超全局变量无法通过$GLOBALS 导出/调试/访问。现在找不到了。

标签: php global-variables noop


【解决方案1】:

我不确定您的问题是否使用了正确的动词。 $_SERVER 是一个变量。 Variables 是值的容器,它们“什么都不做”。 $GLOBALS 变量是变量中数组值的根。 $_SERVER 变量和其他变量匹配/映射为该数组中的键。运行 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*
    )

更新:我刚刚阅读了您帖子中的代码并闪回到 php 版本 3。注册超级全局变量在当时很常见。这不是在现代 PHP 中完成的事情。我建议删除此代码并进行重构以修复因此发生的任何错误。注册超级全局变量,不管它们是你的还是其他的,都会导致一些令人讨厌的安全性。如果处理不当,就会出现缺陷。 register_globals 已被弃用。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多