Не можете получить доступ к суперглобалам внутри __callStatic? - PullRequest
4 голосов
/ 06 декабря 2011

Следующий код завершается ошибкой при моей установке 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 ]

8 голосов
/ 06 декабря 2011

Как указано в руководстве:

Note: Variable variables

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

( ссылка )

2 голосов
/ 06 декабря 2011

[править - добавлен возможный обходной путь]

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();
...