IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Sessions et objets


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Par défaut [POO] Sessions et objets
    Bonjour,

    Alors voila mon problème : pour faire simple, j'ai deux classes, une classe Person et une classe Event. La classe Person possède en attribut un tableau d'objets Event.

    Pour garder un objet Person d'une page à une autre, je le serialize en le passant dans une variable de session dans la première page et le déserialize en récuperant ladite variable dans la seconde.

    1ère page (code simplifié) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    session_start();
     
    require_once 'Person.php';
    require_once 'Event.php';
     
    $p=new Person();
     
    $p->addEvent(new Event());
     
    $_SESSION['p']=$p;
    2e page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    require_once 'Person.php';
    require_once 'Event.php';
     
    session_start();
     
    $p=$_SESSION['p'];
     
    //print_r pour vérifier que tout a bien été récupéré
     
    print_r($p);
    Et là, d'après print_r, j'ai bien récupéré mon objet Person sauf que les éléments de son tableau d'Event ne sont pas reconnus comme des objets de la classe Event mais à la place, je me prends un "__PHP_Incomplete_Class_Object", sous-entendu la définition de la classe Event n'a pas été trouvée lors de la déserialization.

    Je ne comprends pas d'autant plus que j'ai bien appelé la définition des classes Person et Event avant d'appeler session_start(). Mon problème est donc de savoir où (dans la 2e page, dans le fichier Person.php ?), quand et comment inclure la définition de la classe Event. J'ai déjà essayé de jouer avec les méthodes magiques __autoload et __wakeup mais sans grand succès.

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    session_start();
     
    require_once 'Person.php';
    require_once 'Event.php';
     
    $p=new Person();
     
    $p->addEvent(new Event());
     
    $_SESSION['p']=$p;
    pourrais-tu essayer ainsi et voir si tu as toujours l'erreur?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $p=new Person();
    $e=new Event();
     
    $p->addEvent($e);
    Si ça ne va tjrs pas, mets nous le code de tes deux classes ça pourrait aider.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Par défaut
    Je crois que
    session.start();
    doit etre la 1ere ligne de ton code dans la 2e page.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Par défaut
    EDIT @goulhasch : non, dans la deuxième page, la définition des classes doit bien être chargée avant de démarrer la session.

    Non, ça ne marche toujours pas.

    Voici le code (là aussi simplifié) de Person :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    require_once 'Event.php';
    class Person
    {
    	private $events;
     
    	function __construct()
    	{
    		//Rien d'intéressant dans le constructeur : on ne touche pas à $events ici.
    	}
     
    	public function addEvent($e)
    	{
    		if($e instanceof Event)
    			$events[]=$e;
    		else
    			throw new Exception("L'objet n'est pas de type Event");
    	}
    }
    Le constructeur de Event est lui aussi des plus basiques, il se contente uniquement d'assigner les paramètres qui lui ont été passés aux attributs de la classe (Pour l'exemple dans mon premier message, j'ai simplifié avec un constructeur sans paramètres).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    salut
    en effet assez etonant a tu verifier la conf de tes sessions( l'auto start)
    sinon dans le php.ini tu peut mettre une fonction qui appele la definition de tes fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('unserialize_callback_func','loaderClass');

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Par défaut
    J'avais également déjà essayé avec unserialize_callback_func, sans plus de résultats. Je vais encore réessayer et vérifier la config dans le php.ini.

    Si quelqu'un a d'autres idées, je suis toujours preneur

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    hello,

    t'as essayé de faire les choses "proprement" ? <-- j'dis ca j'dis rien c'est pas une critique hein !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $_SESSION['p'] = serialize( $p );
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $p = unserialize( $_SESSION['p'] );

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Solution d'objet en session partagé. Bon ou pas bon ?
    Par berceker united dans le forum Langage
    Réponses: 20
    Dernier message: 10/07/2008, 10h49
  2. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 14h44
  3. [POO] Désactiver un objet dont le nom est passé en parametre
    Par JavaEli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/07/2005, 09h47
  4. [POO] fonction toUpperCase : Objet attendu
    Par LineLe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 17h51
  5. [POO] Passer un objet HTML en argument.
    Par defacta dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2004, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo