Pregunta

¿Es seguro sobrescribir lo superglobal? $_SESSION con un objeto de sesión especializado?

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');
¿Fue útil?

Solución

Si bien esto puede funcionar, no creo que sea un comportamiento sensato.El principio de mínima sorpresa se aplica, en mi opinión, tanto a la programación como al diseño de la interfaz de usuario.Si sobrescribe el comportamiento predeterminado de $_SESSION en su script, eso confundirá muchísimo a algún futuro programador que tenga que lidiar con su código.

Creo que es un truco (y desagradable) abusar de la naturaleza superglobal de $_SESSION De este modo.

Mejor, en mi opinión, sería escribir una clase con métodos estáticos para obtener y configurar sus datos:

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

Luego podrías acceder a esto con Session::get('someKey') o Session::get('someKey', 'default') y Session::set('someKey', 'someValue').

Dado que las clases son inherentemente globales, puede acceder a ellas desde cualquier lugar de su código.Es menos sorprendente y generará menos confusión en el futuro.

Si desea utilizar métodos de objetos por algún motivo de diseño, sería mejor implementar el patrón Singleton.

Otros consejos

Me parece un poco arriesgado.¿Has revisado el session_set_save_handler ¿método?Le permite designar su propio controlador para usar, en lugar de intentar sobrescribir $_SESSION.

Si usted mismo se ocupa del manejo y almacenamiento de sesiones, puede hacer lo que quiera.La superglobal $_SESSION se puede utilizar como cualquier otra variable en ese sentido.

Es sólo el controlador de sesión predeterminado de PHP el que lo trata de manera especial.Espera una matriz normal allí (y tampoco debe estar indexada numéricamente).Si quisieras usarlo nuevamente, necesitarías deshacer el elegante ajuste de ArrayObject con una llamada de apagado:

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top