Question

Est-il sûr de remplacer le $_SESSION super-global avec un objet de la session spécialisée?

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');
Était-ce utile?

La solution

Bien que cela puisse fonctionner, je ne pense pas que ce comportement sensible. Le principe de moindre surprise applique, à mon avis, à la programmation autant que la conception de l'interface utilisateur. Si vous écrasez le comportement par défaut de $_SESSION dans votre script, qui va confondre l'enfer de un programmeur futur qui doit faire face à votre code.

Je pense qu'il est un hack - et un désagréable -. Abuser de la nature super-globale de $_SESSION de cette façon

Mieux, à mon avis, serait d'écrire une classe avec des méthodes statiques pour obtenir et définir vos données:

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

Vous pouvez ensuite accéder à ce avec Session::get('someKey') ou Session::get('someKey', 'default') et Session::set('someKey', 'someValue').

Les classes sont vous pouvez par nature globale, y accéder depuis n'importe où dans votre code. Il est moins surprenant, et entraînera moins de confusion sur la ligne.

Si vous avez besoin d'utiliser des méthodes d'objet pour une raison quelconque de la conception, il pourrait être préférable de mettre en œuvre le modèle Singleton.

Autres conseils

Il semble un peu risqué pour moi. Avez-vous vérifié la méthode session_set_save_handler ? Il vous permet de désigner votre propre gestionnaire à utiliser, au lieu d'essayer d'écraser _SESSION $.

Si vous traitez avec la manipulation et le stockage session de vous-même, vous pouvez faire ce que vous s'il vous plaît. Le _SESSION $ superglobale peut être utilisé comme toute autre variable à cet égard.

Il est seulement phps gestionnaire de session par défaut qui traite spécialement. Il attend un tableau normal il (et ne doit pas être indexé et numériquement). Si vous voulez utiliser ce nouveau, vous auriez besoin de défaire l'emballage de ArrayObject fantaisie avec un appel d'arrêt:

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top