2011-11-13 12 views
7

Digamos que estoy almacenando una matriz u objeto llamado $_SESSION["logged_in_user"].Referenciar variables de sesión en PHP

Si necesito consultarlo repetidamente a lo largo de la secuencia de comandos, ¿cuál de las siguientes es la "mejor práctica"?

  • Uso $_SESSION["logged_in_user"] cada vez (es decir $_SESSION["logged_in_user"]["first_name"])?

  • ¿Copia el objeto en una nueva variable como $logged_in = $_SESSION["logged_in_user"]?

  • crear una referencia a la variable de sesión como $logged_in =& $_SESSION["logged_in_user"]

Probablemente estoy pensando demasiado esto, pero mis principales preocupaciones son la escritura de los gastos generales y la legibilidad. No estoy seguro de si hacer referencia a una variable de sesión repetidamente es más lento que hacer referencia a una variable declarada en línea. Tampoco sé si copiar una variable de sesión en una variable "regular" agrega más sobrecarga de la necesaria. Me gusta la legibilidad de $logged_in["first_name"] sobre $_SESSION["logged_in_user"]["first_name"].

Entonces, ¿hay alguna mejor práctica aquí, o realmente no importa?

+0

realmente no importa. Lo que sea que tenga sentido para ti. Sin embargo, una referencia parece un poco exagerada. Personalmente, id va con la creación de una nueva variable. –

+0

Nunca he visto una variable de referencia creada para una variable '$ _SESSION', pero esto se ve como una micro optimización, y es realmente su preferencia. – nickb

+0

Normalmente creo una clase que trata con usuarios. – Ben

Respuesta

6

No lo piensa demasiado ... ¡pensar es bueno!

Yo personalmente uso Symfony 1.4 para codificar en, que resuelve problemas como estos, pero se puede optar por quedarse :-) magra

pensaría OO (orientado a objetos). Crea una clase de usuario. A continuación, realice llamadas como UserFactory :: getCurrentUser() o User :: getCurrentUser() que devolverá el objeto de usuario actualmente conectado. Entre las variables miembro de esa clase estaría el user_id. Sin embargo, podrá agregar funcionalidad y datos adicionales a esa clase.

Recuerde, pensar en OO significa usar términos abstractos que están muy cerca del dominio del problema. Usuario, automóvil, pedido, etc. No tiene que ser específico y no tiene que incluir toda la información disponible en esa clase para que sea "completa", sea lo que sea. Solo incluya los datos que necesita en ese momento (tenga en cuenta yagni). Las clases son ilusiones de lo concreto, cosas del mundo real. Así como el modelado en 3D es una ilusión de un mundo real.

Espero que ayude ...

+0

totalmente. eso es precisamente lo que quise decir con una clase de contenedor de sesión. –

+0

Fantástica respuesta. –

1

No lo estás pensando en exceso, en mi opinión.

Pero a menos que tenga alguna clase de sesión envoltura/gerente, entonces yo sólo tiene que utilizar:

$_SESSION['logged_in_user'] 

De cualquier manera, no es un gran negocio. Use lo que funcione para .

1

Puede crear una clase para administrar sus sesiones:

class MySession { 

    public static &get($key){ 

    if(!array_key_exists($key, $_SESSION){ 
     return null; 
    } 

    return $_SESSION[$key]; 

    } 

} 

De esa manera usted no tiene que preocuparse acerca de cómo recuperar los valores, que no está duplicando los datos:

$first_name = MySession::get('first_name'); 

Nota: esta solución se ocupa de acceso a la sesión y no con su aplicación específica :)

+0

Me gusta esto. Todavía me cuesta pensar en términos de clases estáticas (entiendo el concepto, pero nunca me vienen a la mente como solución). Una pregunta, en este caso, ¿no tendría que llamar '' first_name = MySession :: get ("logged_in_user ['first_name']") '? –

+0

Puedes usarlo directamente también, realmente no importa. Debe hacer lo que tenga más sentido para cada caso específico. En cuanto al ejemplo específico al que hace referencia, primero debe obtener el conjunto "logged_in_user" y luego recuperar el primer nombre de él. Como dije, esto fue solo una sugerencia sobre cómo tratar la sesión. Su implementación específica requiere una combinación de esto más lo que dice Homer6. – SuitedSloth

1
$_SESSION["logged_in_user"]["first_name"] 

Quédate simple; & no agregue más cabezas para hacer nuevas habitaciones para las mismas variables.

7

$_SESSION es una matriz especial superglobal de PHP. Por lo que técnicamente puede hacer referencia a ella siempre que lo desee con sólo usarlo:

$_SESSION['logged_in_user'] 

Sin embargo, es especial también porque puede cambiar. El siguiente ejemplo hace que este visible:

$alias =& $_SESSION; 
session_start(); 
$alias['foo'] = 'bar'; 

Este código no va a fijar $_SESSION['foo']. El $alias apunta a un $_SESSION anterior, session_start() ha creado una nueva sesión.

Si conoce las advertencias como estas, puede crear naturalmente su propia abstracción $_SESSION.

Cuestiones relacionadas