Search code examples
phpsessionsuperglobalsfilter-input

How to access superglobals in correct way?


I'm discovering secrets of PHP. I've found one thing that I don't have answer to. I would like to access variables from super-global $_SESSION in class. Everything works but PHPMD engine to check mess in code is showing me issue.

I'm getting value from $_SESSION super-global this way

$value = $_SESSION["value"];

And I'm editting values of $_SESSION super-global this way

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

PHPMD is showing me issue:

accesses the super-global variable $_SESSION.

So I'm finding another way how to edit and get values of super-global $_SESSION correctly.

I've tried to use filter_input, problem is that when I use INPUT_POST as type(argument 1), PHP shows me warning:

INPUT_SESSION is not yet implemented

Thanks for future answers :)

EDIT (Quotes from phpmd documentation)

Superglobals Since: PHPMD 0.2. Accessing a super-global variable directly is considered a bad practice. These variables should be encapsulated in objects that are provided by a framework, for instance.


Solution

  • As the hint says, accessing the superglobals violates the encapsulation principle

    A really basic approach would be:

    class SessionObject
    {
        public $vars;
    
        public function __construct() {
            $this->vars = &$_SESSION; //this will still trigger a phpmd warning
        }
    }
    
    $session = new SessionObject();
    $session->vars['value'] = "newValue";
    

    You can also have a look to the Symfony HttpFoundation Component for a full-fledged implementation