2009-03-02 12 views
5

Tengo un script PHP que se llama de 2 maneras desde una llamada Dojo Ajax xhrGet. La primera vez se invoca con un argumento "init" que hace que el script cree una instancia de la clase StateList y lea en un archivo de nombres de estado.¿Por qué no puedo almacenar una instancia de clase PHP como variable de SESSION?

session_start(); 
@include('StateList.php'); 
require_once('phplog.php'); 

//start executing here 
$comd=$_GET['nexturl']; 
if($comd=="init") { 
$st = new StateList("../data/statestxt.txt"); 
$_SESSION['statefile'] = $st; 
} 

La segunda y más veces, otra llamada xhrGet pasa un argumento "getState" y el código siguiente trata de obtener la instancia ofr la clase StateList de la matriz de sesión.

if($comd =="getstate") { 
$st= $_SESSION['statefile']; 
phplog("size=".$st->getSize()); 

}

Sin embargo, el método getSize() nunca se ejecuta, ni puedo llamar a cualquier otro método en la instancia de la clase StateList reconstituido.

Tenga en cuenta que este es un script PHP que INCLUYE la definición de clase en la parte superior y por lo tanto, los métodos de clase deben conocerse y estar disponibles.

¿Qué me falta aquí?

+0

Trate de evitar el uso de @; simplemente escriba su código correctamente para que no haya ningún error que suprimir. –

Respuesta

1

Es posible que necesite serialize el objeto/variable $ st antes de almacenarlo. Esto asegurará que todo se guarde en la sesión. Este es definitivamente el camino a seguir para el código object oriented. Cuando desee volver a utilizar los datos, debe unserialize.

+6

Las variables de sesión se serializan y se deserializan automáticamente. – outis

14

Debe incluir la definición de clase antes de llamar a session_start(), de lo contrario, el objeto no se deserializará correctamente y será una instancia de __PHP_Incomplete_Class. De lo contrario, lo que tienes debe funcionar bien.

+1

Si muevo la definición como sugiere, el valor devuelto por la matriz de sesión es nulo. –

+0

¿tiene display_errors on y error_reporting E_ALL? ¿Puedes asegurarte de que el primer bit se esté ejecutando ($ comd == "init")? –

0

Si va a almacenar un objeto en la sesión, debe ser link text. Hay MUCHOS problemas con serializar objetos en PHP, y mucho menos almacenarlos en la sesión. Recomiendo no hacer esto por completo, y encontrar una solución diferente para su problema. Sin embargo, si vas a hacerlo, deberías consultar los 'métodos mágicos' link text que debes definir en tu clase para facilitar su reinstalación cuando se llame desde la sesión.

0

¿Tiene session.auto_start habilitado? página de sesión del Manual establece que si lo hace, tiene que cargar la definición de clase diferente:

Si enciende session.auto_start entonces la única manera de poner objetos en sus sesiones es cargar su definición de clase utilizando auto_prepend_file en el que carga la definición de la clase, de lo contrario tendrá que serializar su objeto y deserializarlo después.

http://php.net/manual/en/intro.session.php

Como dice esa página, la serialización/unserialization del objeto normalmente se hará automáticamente por PHP, pero después de haber activado session.auto_start va a cambiar esto.

+0

No, no está habilitado. –

1

Esta es una de esas cosas que es difícil de depurar de forma aislada. Almacenar objetos instanciados en PHP Sessions siempre es un poco complicado y no está 100% garantizado de funcionar. Aquí hay algunos consejos generales para la eliminación de errores que pueden ayudarlo a resolver esto.

Primero, verifique su registro de errores de apache. ¿Estás obteniendo un "método llamado error no objeto"?Si es así, esto significa que no está recuperando un objeto de la sesión. Si no, ¿hay algún error que indique que su llamada al método está fallando por algún otro motivo?

En segundo lugar, compruebe lo que realmente está saliendo de su sesión.

if($comd =="getstate") { 
    $st= $_SESSION['statefile']; 
    //get the class of st 
    phplog("instance=".get_class($st)); 

    //get a reflection dump of st 
    $ref = new ReflectionClass($st); 
    $string = $ref->__toString();  
    phplog("reflection=".$string); 
} 

En tercer lugar, mira el valor de cadena en serie que está siendo almacenado en la propia sesión. ¿Estás almacenando un objeto serializado? En el entorno de desarrollo, establecer el valor session.save_path ini en php.ini a algo como/tmp, (o utilizar el método ini_set a hacer lo mismo):

session.save_path = "/tmp" 

y luego examinar los archivos creados en/tmp (o cualquier carpeta). Debería ver una cadena que comienza con:

statefile:O:.......... 

El nombre de la clase que crea una instancia del objeto también se incluirán en ese país, así como los valores guardados en propiedades.

0

Prueba esto:

include('StateList.php'); 
    require_once('phplog.php'); 
    // start your session after including your class file 
    session_start(); 

    //start executing here 
    $comd=$_GET['nexturl']; 
    if($comd=="init") { 
    $st = new StateList("../data/statestxt.txt"); 
    $_SESSION['statefile'] = $st; 
    } 

    if($comd =="getstate") { 
    // the ampersand creates a reference, preserving any further changes to your session data 
    $st = &$_SESSION['statefile']; 
    phplog("size=".$st->getSize()); 
    } 
+0

código interesante. Creo que podría intentarlo. – transilvlad

Cuestiones relacionadas