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

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

Я получаю ценность от $ _SESSION суперглобальной таким образом

$value = $_SESSION["value"];

И я редактирую значения суперглобального $ _SESSION таким образом

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

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

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

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

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

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

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

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

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

4

Решение

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

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

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 Component для полноценной реализации

2

Другие решения

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

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');
0

По вопросам рекламы [email protected]