Domanda

È sicuro sovrascrivere il $_SESSION superglobale con un oggetto sessione specializzato?

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');
È stato utile?

Soluzione

Sebbene possa funzionare, non credo sia un comportamento sensato.Il principio della minima sorpresa si applica, secondo me, alla programmazione tanto quanto al design dell'interfaccia utente.Se sovrascrivi il comportamento predefinito di $_SESSION nel tuo script, questo confonderà l'inferno di qualche futuro programmatore che deve occuparsi del tuo codice.

Penso che sia un trucco - e spiacevole - abusare della natura super-globale del $_SESSION in questo modo.

Sarebbe meglio, secondo me, scrivere una classe con metodi statici per ottenere e impostare i dati:

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
    }
}

Potresti quindi accedervi con Session::get('someKey') o Session::get('someKey', 'default') e Session::set('someKey', 'someValue').

Poiché le classi sono intrinsecamente globali, è possibile accedervi da qualsiasi punto del codice.È meno sorprendente e risulterà in meno confusione su tutta la linea.

Se desideri utilizzare i metodi degli oggetti per qualche motivo di progettazione, potrebbe essere meglio implementare il pattern Singleton.

Altri suggerimenti

Mi sembra un po 'rischioso.Hai controllato il metodo session_set_save_handler ?Ti consente di designare il tuo gestore da usare, invece di provare a sovrascrivere $ _SESSION.

Se ti occupi personalmente della gestione e dell'archiviazione delle sessioni, puoi fare tutto ciò che desideri.Il superglobale $ _SESSION può essere utilizzato come qualsiasi altra variabile a tale riguardo.

È solo il gestore di sessione predefinito di PHP che lo tratta in modo speciale.Si aspetta un array normale lì (e non deve essere anche indicizzato numericamente).Se volessi usarlo di nuovo, dovresti annullare il fantastico wrapping di ArrayObject con una chiamata di arresto:

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top