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] Variable dynamique


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 29
    Points
    29
    Par défaut [POO] Variable dynamique
    Bonjour à tous.

    J'ai un petit probleme que je vais tenter d'expliquer
    Imaginons que j'ai un objet de type
    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
     
    array(2) {
      [0]=>
      object(stdClass)#4 (2) {
        ["name"]=>
        string(5) "Forum"
        ["url"]=>
        string(5) "forum"
      }
      [1]=>
      object(stdClass)#5 (2) {
        ["name"]=>
        string(4) "Home"
        ["url"]=>
        string(4) "home"
      }
    }
    Imaginons que ces valeurs sont dans un classe.

    j'aimerais par l'intermédiaire d'une variable string accéder à une partie de l'objet.
    Je m'explique.

    $this->menu contient les valeur plus haut.

    Le code suivant est faux mais il aide à la compréhension de ce que je veux faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $path = '[1]->name';
    $valeur  = $this->menu{$path};
    J'ai fait pas mal de test, le seule qui passe c'est avec l'utilisation d'un eval (beurk).

    Donc j'aimerais savoir si il y a une autre méthode, sachant que "$path" est inconnu à la base, qu'il est construis dynamiquement.
    Ca fait plusieur heure que je cherche une solution donc tout idée sera bonne.

    Merci d'avance des éventuelle réponse.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 551
    Points
    8 551
    Billets dans le blog
    17
    Par défaut
    Ceci te convient-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $index = 1 ;
    $member = 'name' ;
    $name = $this->menu[$index]->{$member} ; // Home

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Malheureusement non

    Je vais plus expliquer mon probleme peut être qu'il y a une autre solution que je connais pas.

    Comme je l'ais dit j'ai un objet (voir la syntaxe plus haut).

    Dans lequel je voudrais injecter petit à petit des données dedans.
    Je pensais me faire une méthode qui fonctionnerait comme il suit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objet::addElement('forum',array(
        'name'=>'je suis une option',
        'url'=>'options'
    ));
    Ce qui donnerait au final

    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
    20
    21
    22
    23
    24
    25
    array(2) {
      [0]=>
      object(stdClass)#4 (2) {
        ["name"]=>
        string(5) "Forum"
        ["url"]=>
        string(5) "forum"
        ["child"]=>
        array(1) {
           [0]=>
           object(stdClass)#6 (2) {
                ["name"]=>
                string(18) "Je suis une option"
                ["url"]=>
                string(7) "options"
        }
      }
      [1]=>
      object(stdClass)#5 (2) {
        ["name"]=>
        string(4) "Home"
        ["url"]=>
        string(4) "home"
      }
    }
    En gros en premier paramètre je donne le chemin dans l'objet et en 2eme les fils que j'ajoute.

    Et au final j'aimerais faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objet::addElement('forum->options',array(
        'name'=>'je suis une sous-option',
        'url'=>'sousoption'
    ));
    Ce qui au final ajoutera des fils à options qui se trouve dans forum.

    J'espère que je suis suffisamment clair dans ma formulation.

    En tout cas merci pour la réponse même si ca répond pas à ma question.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 551
    Points
    8 551
    Billets dans le blog
    17
    Par défaut
    La méthode est mauvaise àmha.

    Plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    objet::addElement('forum',array(
        'name'=>'je suis une option',
        'url'=>'options'
    ));
    Qui force à faire une recherche dans l'arborescence, fais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $parentObjectForum->addChild(array(
        'name'=>'je suis une option',
        'url'=>'options'
    ));

  5. #5
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2008
    Messages : 71
    Points : 117
    Points
    117
    Par défaut
    En utilisant les méthode magiques ?

    Voici un exemple fonctionnel (à adapter selon tes besoins) :

    D'abord, un objet d'option :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    Class MonOption
    {
    	public $nom;
    	public $url;
     
    }

    Ensuite, ton objet conteneur :

    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
    <?php
    class MaClasse
    {
    	private $options = array();
     
     
    	 public function __set($option,$argument)
    	{
    		if(!array_key_exists($option,$this->options));
    			$this->options[$option] = $argument;
    	}
     
     
    	public function __get($option)
    	{
    		return $this->options[$option];
    	}
    }

    On l'appelle ensuite comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $classe = new MaClasse;
    $option  = new MonOption;
    $option->nom = "un nom au pif";
    $option->url = "uneUrlAuPif/";
     
    $autreOption = new MonOption;
    $autreOption->nom = "un nom au pif pour une autre option";
    $autreOption->url = "/uneautreurlaupif/";
     
    $classe->objet  = $option;
    $classe->autreObjet = $autreOption;
    echo $classe->objet->nom;
    echo $classe->autreObjet->url;

    Un résultat d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MacMini:Desktop benjamin$ php a.php
    un nom au pif
    /uneautreurlaupif/

    Ce code fait appelle aux méthodes magiques __set() et __get(). Ces méthodes te permettent de gérer des attributs de classe non existants.

    Elle est très pratique notamment dans le cade d'un objet de gestion de configuration où tu ne connais pas les options à l'avance. Il me semble que ça correspond à ton problème. Si je me trompe, n'hésites pas à le dire

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    Merci pour vos réponses, il va falloir que je vois comment je peux adapter ca.
    Par contre petit oubli, l'appli est en php4 donc si je dis pas de connerie, j'ai pas accés à __set() et __get().

  7. #7
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2008
    Messages : 71
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par kaen25 Voir le message
    Merci pour vos réponses, il va falloir que je vois comment je peux adapter ca.
    Par contre petit oubli, l'appli est en php4 donc si je dis pas de connerie, j'ai pas accés à __set() et __get().
    argh!

    C'est l'occasion de passer à PHP 5

  8. #8
    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
    Tu peux facilement remplacer les méthodes __set et __get par des méthodes classiques.

    Tu accèdes ensuite à tes données par le biais de méthodes plutôt que par le biais de pseudo membres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $classe = new MaClasse;
    $option  = new MonOption;
    $option->setVal( 'nom' , "un nom au pif" );
    $option->setVal( 'url' , "uneUrlAuPif/" );
     
    echo $option->getVal( 'url' );
    Ca change pas grand chose et c'est à la limite plus "propre".

Discussions similaires

  1. [POO] nom d'objet en variable dynamique
    Par mayadev dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2009, 15h26
  2. [POO] Remplacement dynamique de variable
    Par max-mag dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2008, 11h35
  3. [POO] Création dynamique de variables de classe
    Par Philoulheinz dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 15h38
  4. [POO] Déclaration dynamique de variable membre
    Par fredrik dans le forum Langage
    Réponses: 10
    Dernier message: 01/09/2006, 08h12
  5. [POO] Variable Dynamique de Classe
    Par CNoob dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2006, 22h05

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