无法访问__callStatic内的Super Globals?

时间:2011-12-06 18:18:06

标签: php static-methods

以下代码在安装PHP 5.3.6-13ubuntu3.2时失败,这让我想知道为什么我无法在此方法中访问$ _SERVER Super Global。

<?php

header('Content-Type: text/plain');

$method = '_SERVER';
var_dump($$method); // Works fine

class i
{
    public static function __callStatic($method, $args)
    {
        $method = '_SERVER';
        var_dump($$method); // Notice: Undefined variable: _SERVER
    }
}

i::method();

有人知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:8)

如手册中所示:

Note: Variable variables

Superglobals cannot be used as variable variables inside functions or class methods. 

reference

答案 1 :(得分:2)

[编辑 - 添加了可能的解决方法]     

header('Content-Type: text/plain');

class i
{
    public static function __callStatic( $method, $args)
    {
        switch( $method )
        {
        case 'GLOBALS':
            $var =& $GLOBALS;
            break;

        case '_SERVER':
            $var =& $_SERVER;
            break;

        case '_GET':
            $var =& $_GET;
            break;
        // ...
        default:
            throw new Exception( 'Undefined variable.' );

        }

        var_dump( $var );
    }
}

i::_SERVER();
i::_GET();

[原始答案] 这很奇怪。我同意它可能是一个PHP错误。但是,超全球确实有效,而不是变量变量。

<?php

header('Content-Type: text/plain');

$method = '_SERVER';
var_dump($$method); // Works fine

class i
{
    public static function __callStatic( $method, $args)
    {
        var_dump( $_SERVER ); // works

        var_dump( $$method ); // Notice: Undefined variable: _SERVER
    }
}

i::_SERVER();