2009-03-02 7 views
5

J'ai un script PHP qui est appelé de deux manières à partir d'un appel Dojo Ajax xhrGet. La première fois qu'il est appelé avec un argument "init" qui provoque le script pour créer une instance de la classe StateList et lire dans un fichier de noms d'état.Pourquoi ne puis-je pas stocker une instance de classe PHP en tant que variable 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 deuxième et d'autres fois, un autre appel xhrGet passe un argument « getstate » et le code suivant tente d'obtenir l'instance OFR la classe StateList du tableau SESSION.

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

}

Cependant, la méthode getSize() est jamais exécuté, et je ne peux appeler toute autre méthode sur l'instance de classe StateList reconstitué.

Notez qu'il s'agit d'un script PHP qui inclut la définition de la classe en haut et donc les méthodes de classe doivent être connues et disponibles.

Qu'est-ce qui me manque ici?

+0

Essayez d'éviter d'utiliser @; il suffit d'écrire votre code correctement afin qu'il n'y ait pas d'erreurs à supprimer. –

Répondre

1

Vous devrez peut-être serialize l'objet/variable $ st avant de le stocker. Cela garantira que tout est enregistré dans la session. C'est certainement la voie à suivre pour le code object oriented. Lorsque vous souhaitez réutiliser les données, vous devez le unserialize.

+6

Les variables de session sont automatiquement sérialisées et non sérialisées. – outis

14

Vous devez inclure la définition de la classe avant d'appeler session_start(), sinon l'objet ne sera pas désérialisé correctement et sera une instance de __PHP_Incomplete_Class. Sinon, ce que vous avez devrait fonctionner correctement.

+1

Si je déplace la définition comme vous le suggérez, la valeur renvoyée par le tableau de session est null. –

+0

avez-vous des erreurs display_errors et error_reporting E_ALL? Pouvez-vous vous assurer que le premier bit est en cours d'exécution ($ comd == "init")? –

0

Si vous voulez stocker un objet dans la session, il doit s'agir de link text. Il y a beaucoup de problèmes avec la sérialisation des objets en PHP, sans parler de les stocker dans la session. Je recommande de ne pas le faire complètement et de trouver une solution différente à votre problème. Si vous allez le faire cependant, vous devriez regarder dans les 'méthodes magiques' link text que vous devez définir dans votre classe pour faciliter sa réinstanciation quand elle est appelée depuis la session.

0

Avez-vous activé session.auto_start? La page de la session du manuel indique que si vous le faites, vous devez charger la définition de classe différente:

Si vous activez session.auto_start alors la seule façon de mettre des objets dans vos sessions est de charger sa définition de classe à l'aide auto_prepend_file dans lequel vous chargez la définition de la classe, sinon vous devrez sérialiser votre objet et le désérialiser ensuite.

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

Comme cette page dit, la sérialisation/délinéarisation de l'objet sera normalement fait automatiquement par PHP, mais ayant permis session.auto_start va changer cela.

+0

Non, il n'est pas activé. –

1

C'est une de ces choses qui sont difficiles à déboguer isolément. Stocker des objets instanciés dans des sessions PHP est toujours un peu délicat, et pas garanti à 100% pour fonctionner. Voici quelques conseils généraux de débogage qui peuvent vous aider à comprendre cela.

Tout d'abord, vérifiez votre journal des erreurs Apache. Obtenez-vous une "méthode appelée sur l'erreur non-objet"?Si c'est le cas, cela signifie que vous ne récupérez pas un objet hors de la session. Si non, y a-t-il une erreur indiquant que l'appel de votre méthode échoue pour une autre raison? Deuxièmement, vérifiez pour voir ce que vous sortez vraiment de votre session. Troisièmement, regardez la valeur de chaîne sérialisée qui est stockée dans la session elle-même. Est-ce que vous stockez réellement un objet sérialisé? Dans votre environnement de dev, définissez la valeur ini session.save_path dans php.ini à quelque chose comme/tmp, (ou utiliser la méthode ini_set pour faire la même chose):

session.save_path = "/tmp" 

puis examinez les fichiers créés dans/tmp (ou n'importe quel dossier). Vous devriez voir une chaîne qui commence par:

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

Le nom de la classe qui instancié l'objet sera également inclus là-dedans, ainsi que les valeurs enregistrées dans les propriétés.

0

Essayez ceci:

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

code intéressant. Je pense que je pourrais essayer. – transilvlad

Questions connexes