Как правильно получить доступ к суперглобалам?

Я открываю секреты PHP. Я нашел одну вещь, на которую у меня нет ответа. Я хотел бы получить доступ к переменным из суперглобального $_SESSION в классе. Все работает, но механизм PHPMD для проверки беспорядка в коде показывает мне проблему.

Таким образом я получаю значение от $_SESSION super-global

$value = $_SESSION["value"];

И я редактирую значения $_SESSION super-global таким образом

$_SESSION['value'] = "newValue";

PHPMD показывает мне проблему:

обращается к суперглобальной переменной $_SESSION.

Поэтому я нахожу другой способ, как правильно редактировать и получать значения суперглобального $_SESSION.

Я пытался использовать filter_input, проблема в том, что когда я использую INPUT_POST как тип (аргумент 1), PHP показывает мне предупреждение:

INPUT_SESSION еще не реализован

Спасибо за будущие ответы :)

РЕДАКТИРОВАТЬ (Цитаты из документации phpmd)

Суперглобальные с: PHPMD 0.2. Прямой доступ к суперглобальной переменной считается плохой практикой. Эти переменные должны быть инкапсулированы, например, в объекты, предоставляемые фреймворком.


person UareBugged    schedule 17.07.2016    source источник
comment
Зачем вы смешиваете здесь три темы? Особенности языка, ограничения filter_input и, в частности, PHPMD не связаны.   -  person mario    schedule 17.07.2016
comment
Послушайте, я описал все, о чем идет речь, чтобы все знали, чего я хочу. Трудно описать это без этих 3 тем. Извините, что смешал их в одном вопросе. На практике я просто хочу знать, есть ли другой способ доступа и редактирования суперглобальной переменной $_SESSION.   -  person UareBugged    schedule 17.07.2016
comment
Первый путь правильный и единственный. PHPMD, показывающий проблему, является всего лишь рекомендацией (и не очень умной).   -  person mario    schedule 17.07.2016
comment
Я думал об этом, но вы знаете, я не был уверен, поэтому я создал этот вопрос. Спасибо за ваше время   -  person UareBugged    schedule 17.07.2016


Ответы (2)


Как говорится в подсказке, доступ к суперглобальным переменным нарушает принцип инкапсуляции.

Действительно базовый подход:

class SessionObject
{
    public $vars;

    public function __construct() {
        $this->vars = &$_SESSION; //this will still trigger a phpmd warning
    }
}

$session = new SessionObject();
$session->vars['value'] = "newValue";

Вы также можете ознакомиться с компонентом Symfony HttpFoundation для полноценной реализации.

person dani g    schedule 04.08.2016
comment
Итак, окончательное решение состоит в том, чтобы инкапсулировать, как это сделано в вашем примере, И подавить предупреждение? - person Bjinse; 25.09.2018

Это всего лишь «плохая практика», вы все равно можете напрямую обращаться к суперглобалам, если вы являетесь поклонником «лучших практик», создайте такой небольшой класс:

class Session{

    public static function put($key, $value){
        $_SESSION[$key] = $value;
    }

    public static function get($key){
        return (isset($_SESSION[$key]) ? $_SESSION[$key] : null);
    }

    public static function forget($key){
        unset($_SESSION[$key]);
    }
}

И используйте таким образом:

Session::put('foo', 'bar');
$bar = Session::get('foo');
Session::forget('foo');
person Claudio King    schedule 17.07.2016