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 :

Passage de tableaux d'objets dans la session


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sourivore
    Homme Profil pro
    Lead Tech Front-End
    Inscrit en
    Juin 2005
    Messages
    451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lead Tech Front-End

    Informations forums :
    Inscription : Juin 2005
    Messages : 451
    Par défaut Passage de tableaux d'objets dans la session
    Bonjour,

    J'ai un nouveau problème dans le passage d'objets dans les sessions.
    Je passe un objet Formulaire qui possède un attributs $champs.
    Dans ce tableau j'ai ajouté préalablement des objets héritant de la classe Champ.
    Quand je récupère ce tableau après avoir désérialisé l'objet Formulaire, je suis obligé d'inclure toutes les classes ChampTexte, ChampMDP, ListeDeroulante... avant d'utiliser une méthode de la classe Champ sur cet objet.

    Plus concrètement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Formulaire{
       private $champs = array();
     
       public addChamp($champ){
          $champs[] = $champ;
       }
     
       public getChamps(){
          return $champs;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Champ{
       traiteChamp();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class ChampTexte extends Champ{}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class ChampMDP extends Champ{}
    page1.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $form = new Formulaire();
    $champTexte = new ChampTexte();
    $champMDP = new champMDP();
    $form->addChamp($champTexte);
    $form->addChamp($champMDP);
    $_SESSION['formulaire'] = serialize($form);
    header('Location: page2.php');
    page2.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $form = unserialize($_SESSION['formulaire']);
    foreach($form->getChamps() as $champ){
       $champ->traiteChamp();
    }
    Résultat : Dans la page page2.php je suis obligé d'inclure les fichiers ChampTexte, ChampMDP alors que la méthode qui m'intéresse est uniquement la classe Champ

    Y a t il un moyen de faire autrement ?

    Si le PHP était typé $champs serait déclaré en tant que Collection<Champ>, mon foreach m'aurait retourné un Champ et là je n'aurais pas eu de problème...

    En outre, j'ai essayé dans mon foreach de récupérer la classe de l'objet grâce à un get_class afin de faire un include à ce moment mais après désérialization ma classe est une PHP_incomplete_class... car je n'ai pas inclu la classe. C'est donc un peu le loup qui se mord la queue ^^

    Effectivement c'est dommage d'inclure toutes les classe qui dérivent de champ même si je n'ai pas besoin de toutes.

    Merci d'avance.

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    pas sûr mais à mon avis dès que tu fais :

    $form = unserialize($_SESSION['formulaire']);

    T'as forcément besoin des classes pour reconstruire ton objet vu que dans $form t'as stocké un ChampTexte et un ChampMDP. Donc a priori, je dirais que y a pas de soluce. Problème intéressant, s'il y en a une ça m'intéresse aussi
    Je pense que t'aurais eu le même problème dans un langage typé, à la reconstruction de l'objet.
    Sinon il y a peut-être moyen d'upcaster les membres avant le serialize ? (car après je pense que c'est trop tard)

  3. #3
    Membre éclairé Avatar de sourivore
    Homme Profil pro
    Lead Tech Front-End
    Inscrit en
    Juin 2005
    Messages
    451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lead Tech Front-End

    Informations forums :
    Inscription : Juin 2005
    Messages : 451
    Par défaut
    Bonjour et merci de ta réponse.

    Peux-tu être plus précis concernant le terme "upcaster" ?
    S'agit-il de passer dans l'objet Formulaire en plus de la liste des champs associés, la liste des types de ces champs ?

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Non en fait l'idée et de caster en objet de la classe mère mais je ne sais pas si c'est faisable en php. Un truc du style, mais j'y crois pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i = 0, $c = count($champs); $i < $c; $i++){
       $champs[$i] = (Champ)($champs[$i]);
    }
    [edit] Non en plus ça ne fera pas ce que tu veux car même si ça marchait, le cast supprimera toutes les infos des classes filles. Désolé pour la fausse piste.

  5. #5
    Membre éclairé Avatar de sourivore
    Homme Profil pro
    Lead Tech Front-End
    Inscrit en
    Juin 2005
    Messages
    451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lead Tech Front-End

    Informations forums :
    Inscription : Juin 2005
    Messages : 451
    Par défaut
    Exact, je dirais même plus que dans n'importer quel langage on ne peut pas caster un objet de la classe fille vers la classe mère (c'est plutôt l'inverse)

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2007, 18h15
  2. Passage de tableau à deux dimensions dans une session
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 19h42
  3. [POO] objet dans une session
    Par ujoodha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/09/2006, 11h57
  4. Stocker un objet dans la session
    Par Matth_S dans le forum ASP
    Réponses: 9
    Dernier message: 20/09/2006, 12h34
  5. [POO] PHP 5, transmettre objet dans la session
    Par FCDB dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2006, 15h26

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