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

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    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 du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

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

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    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
    Points : 691
    Points
    691
    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
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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'] );

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Il me semble que les objets sont automatiquement sérializés lorsqu'on les passe en session.

    Si ce n'était pas le cas, ma variable $p ne serait pas reconnue comme un objet Person après y avoir assigné $_SESSION['p'] ($p=$_SESSION['p']) non ?

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    au niveau de la classe person, oui peut etre... mais la serialization "automatique" ne va ptet pas chercher les références à la classe Event contenues dans ton objet.

    toujours est il que passer ses objets en session de cette maniere pour s'économiser la frappe de 9 lettres... désolé je suis pointilleux !

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Ok, j'essaierai dès que je pourrai. J'espère vraiment que le problème est du à quelque chose d'aussi trivial

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Après essai, le problème venait bien du fait que je passais les objets en session directement, sans les sérializer ; comme le pensait Petibidon, seul l'objet Person était sérializé automatiquement, les objets Event ne l'étaient pas.

    Donc, en faisant :

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

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

    Merci beaucoup

+ 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