Безопасно перезаписать суперглобальный $ _SESSION? - PullRequest
4 голосов
/ 13 июня 2011

Безопасно ли перезаписывать суперглобальный $_SESSION специализированным объектом сеанса?

class SessionObject implements ArrayAccess { ... }

...

// Session data has just been deserialised from store.
$_SESSION = new SessionObject( $session_data );

...

// Using session object...
$_SESSION['key'] = 27;
$x = $_SESSION->get_data('key2', 'default-value');

Ответы [ 3 ]

6 голосов
/ 13 июня 2011

Хотя это может сработать, я не думаю, что это разумное поведение.Принцип наименьшего удивления, на мой взгляд, применим как к программированию, так и к дизайну пользовательского интерфейса.Если вы перезапишете поведение по умолчанию $_SESSION в своем скрипте, это может привести в замешательство какого-то будущего программиста, который должен иметь дело с вашим кодом.

Я думаю, что это взлом - и неприятный- злоупотреблять таким образом надглобальной природой $_SESSION.

Лучше, на мой взгляд, написать класс со статическими методами для получения и установки ваших данных:

class Session {
    public function get($key, $defaultValue = null) {
        // do some code to get the value for $key, and return $defaultValue if there is none
    }

    public function set($key, $value) {
        // do some code to set $key
    }
}

Затем вы можете получить к нему доступ с помощью Session::get('someKey') или Session::get('someKey', 'default') и Session::set('someKey', 'someValue').

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

Если вы по каким-то причинам хотели использовать методы объекта, возможно, было бы лучше реализовать шаблон Singleton.

1 голос
/ 13 июня 2011

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

Это только обработчик сеанса PHP по умолчанию, который обрабатывает его специально.Он ожидает нормальный массив там (и не должен быть также численно проиндексирован).Если вы захотите использовать это снова, вам потребуется отменить причудливую упаковку ArrayObject с помощью вызова завершения работы:

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
1 голос
/ 13 июня 2011

Мне немного рискованно.Вы проверили метод session_set_save_handler ?Это позволяет вам назначить свой собственный обработчик, вместо того, чтобы пытаться перезаписать $ _SESSION.

...