2011-01-29 13 views
6

que estoy tratando de guardar un objeto en $_SESSION, pero los siguientes:php objeto ahorro en sesión

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = $user ; 

# on subsequent page loads: 
$user = $_SESSION[ 'user' ] ; #retrieve the user from session 

Desafortunadamente esto no funciona.

La secuencia de comandos intentó ejecutar un método o acceder a una propiedad de un objeto incompleto. Asegúrese de que la definición de clase "Usuario" del objeto sobre el que intenta operar esté cargada _antes de que se llame a unserialize() o proporcione una función __autoload() para cargar la definición de clase

A menos que use serialize():

<?php 

$user = db->load($username, $pass) ; 
$_SESSION[ 'user' ] = serialize($user) ; 

# on subsequent page loads: 
$user = unserialize($_SESSION[ 'user' ]) ; #retrieve the user from session 

Supongo que se requiere una serialización porque la información de la sesión se guarda en el disco. Pero, ¿no debería PHP ser lo suficientemente inteligente como para serializar cosas por sí mismo?

Y con el uso de serializar/_ _ unserialize, es esto va a funcionar ahora de forma fiable? ¿O necesito un método __serialize() en mi clase de PHP?

+0

¿Alguna vez ha pensado en utilizar Zend.Session? –

Respuesta

4

Necesitará el __serialize() en su clase si su objeto necesita realizar alguna acción antes de ser serializado. Por ejemplo, si tenía una referencia a un archivo abierto y ese archivo debía cerrarse correctamente antes de la serialización.

+2

En este caso usaría __sleep y __wakeup

+2

Mis disculpas, eso es lo que quise decir, no hay un método mágico php llamado __serialize () –

1

¿Podría quizás usar var_export? Lo acabo de enterar hoy, así que tal vez no sea tan relevante.

+0

'var_export()' no es realmente una función de serialización. Es solo para crear una representación de cadena legible por humanos de una variable (como 'var_dump()'. No crea una representación completa de la variable, y no hay función inversa. Http://php.net/manual/es /function.var-export.php –

+1

@ Lèse Mi comprensión de 'var_export' era que la cadena que devuelve podría ser' evaluada' para obtener (más o menos) la misma variable. ¿Es incorrecto? – sdleihssirhc

+0

Ah, estás Sí. Lo confundí con 'print_r()'. Sin embargo, aún es mejor serializar objetos con 'serialize()', ya que hay casos en los que la salida de 'var_export()' no producirá los resultados adecuados (por ejemplo, objetos con referencias circulares). –

0

En lo que respecta al compilador de php, todo lo que está haciendo es escribir un objeto (serializado) en una matriz, es un proceso diferente que asegura que $ _SESSION está disponible en la página siguiente. La serialización no tiene nada que ver con que se escriba en el disco más que con la memoria, ya que la memoria asignada a varios métodos en su objeto no estará disponible en la página siguiente. La serialización es la forma en PHP se mantiene en los objetos a través de las páginas, y usted tiene que hacerlo usted mismo.

0

mejor uso

json_encode() json_decode() 
0

Probablemente el mejor enfoque en estos días es la implementación de la interfaz Serializable con su clase.