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] Génération de classe au vol


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Par défaut [POO] Génération de classe au vol
    Bonjour,

    Je me trouve face à un problème dans l'élaboration d'une application écrite en PHP. Je m'explique : une méthode invoquée me retourne des valeurs sous la forme d'un tableau. Ce tableau représente parfaitement à chaque fois un objet. Je voudrais donc transformer ce tableau en un objet PHP. Malheureusement, les informations de retour pouvant être des plus variées, je ne peux pas écrire une classe pour chacune de celles-ci, la liste ne pouvant être exhaustive.

    J'aimerais donc savoir si vous aviez une technique pour transformer un tableau PHP en un objet dynamiquement et ce, sans avoir le squelette d'une classe lui correspondant.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 694
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 694
    Par défaut
    sous PHP 5 il y a des méthodes magiques "get" et "set" pour stocker le tableau dans un objet et le récupérer
    http://php.net/language.oop5.overloading

    sinon en PHP 4 tu peux utiliser cette classe :
    Code php : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Objet 
    {
        function initObjet($donneesObjet = array())
        {
            $this->donneesObjet = $donneesObjet;
        }
     
        function set($nom, $valeur)
        {
            $this->donneesObjet[$nom] =& $valeur;
            $this->_recalcul($nom);
        }
     
        function & get($nom, $avertissementIndefini = TRUE)
        {
            if (isset($this->donneesObjet[$nom])) {
                $retour = $this->donneesObjet[$nom];
            } else {
                if ($avertissementIndefini) {
                    trigger_error("Information \"$nom\" indisponible", E_USER_WARNING);
                }
     
                $retour = NULL;
            }
     
            return $retour;
        }
     
        /**
         * Stockage des attributs dynamiques
         */
        var $donneesObjet;
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Par défaut
    Bonjour,

    Merci pour ton intervention mais ceci revient juste à déclarer un objet contenant un tableau, à la place d'un simple tableau, alors que je désire réellement transformer chaque clé d'un tableau associatif en attribut d'une classe avec sa valeur lui correspondant. Je parle donc de génération de classe au vol car il faut nécessairement je pense déclarer celle-ci avant d'en utiliser un objet.

    Par exemple, avec le tableau associatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $tab['label'] = produit
    $tab['liquide'] = eau
    $tab['nom'] = Evian
    $tab['prix'] = $36
    Je souhaiterais avoir un objet instance de la classe (classe qui n'est pas déclaré lors de la conception de l'application, il faut donc la créer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Produit
    {
         $liquide;
         $nom;
         $prix;
     
         function initProduit($donnees)
         {
              $this -> liquide = $donnees['liquide'];
              $this -> nom = $donnees['nom'];
              $this -> prix = $donnees['prix'];
         }
    }

    afin de pouvoir ensuite instancier un objet en faisant par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Données résultant de l'appel de méthode
    // $tab['label'] = produit
    // $tab['liquide'] = eau
    // $tab['nom'] = Evian
    // $tab['prix'] = $36
     
    $tab = maMethode();
    class Produit = // création de la classe en respectant $tab comme précisé avant
    $obj = new Produit($tab);
    Ce n'est pas très clair sur la fin mais ce n'est pas facile à expliquer

    Merci encore.

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    As-tu seulmement essayer les solutions proposées par Mathieu ? Car elles me semblent correspondre exactement à ton besoin...

  5. #5
    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
    question : pourquoi tu veux transformer ton tableau en objet ? pour y intégrer des méthodes particulieres ? dans ce cas la solution de Mathieu devrait répondre au besoin. Mais définir un objet sans savoir les données qu'il va manipuler... etrange...

    si c'est seulement parce que c'est plus pratique d'accéder a des données en faisant $bidule->truc plutot que $bidule['truc'], un simple cast suffit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bidule = (object) $bidule;
    et tu obtiendras un objet de type StdClass... qui ne sert pas à grand chose hormis que c'est moins chiant à taper...

Discussions similaires

  1. [POO] [PHP 5 CLASSES]Source à part?
    Par Jean_Benoit dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2005, 11h50
  2. Réponses: 3
    Dernier message: 17/10/2005, 16h26
  3. [POO] Ecrire une classe descendante
    Par GLDavid dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2005, 19h04
  4. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  5. [JAXB][XSD] Problème lors de la génération des classes
    Par charlot44 dans le forum Persistance des données
    Réponses: 4
    Dernier message: 22/06/2005, 16h10

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