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] Accéder à des attributs de classes via une variable de variable


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [POO] Accéder à des attributs de classes via une variable de variable
    Bonjour,

    La question que je me pose, c'est est-ce possible ?

    J'utilise avec succès (comme ci-dessous) des variables de variables type ${}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ($i=0; $i<$n; $i++) {       
      $boxmatrix[$i][0] = ${'divbox'.($i+1)}[0]; 
      $boxmatrix[$i][1] = ${'divbox'.($i+1)}[1];
    }
    J'ai essayé de répliquer l'idée dans le code de la fonction suivante déclarée au sein d'une classe en essayant d'appeler un attribut de cette classe (stockant une matrice de données) sous forme variable : j'ai en effet une certain nombre d'attributs qui présentent des modalités de stockage identiques et plutot que de créer une fonction pour intervenir sur chaque attribut, j'ai voulu créer une fonction unique (et donc variabilisée) ... et là gros BUG :
    Parse error: parse error, unexpected T_STRING, expecting T_VARIABLE or '$'
    Ci dessous le code :

    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
    26
    27
    28
    29
    Class {
    Var etc... // (déclarations des attributs)
    par exemple :
    var $Urls;
    var $Boxs; 
    // (attributs vides au départ et stockant une serie d'indices à appel de fonction d'où une stockage en matrice de type[$i][$j] ou où [0][$j] sera par exemple chacun des indices stockés au cours du processus 0
     
      function Change($value, $index, $indexname) {
      // ne gere pas les doublons
        $nbindex = count($index);
        if (isset(count($indexname)))) {:bug: 
          $nbstore = count($indexname);
          $indexname[$nbstore][0] = $value;
          for ($i=0; $i<$nbindex; $i++) {
            $indexname[$nbstore][$i] = $index[$i];
          }
        }
        if (!isset(count($indexname)) {
          $indexname[0][0] = $value;
          for ($i=0; $i<$nbindex; $i++) {
            $indexname[0][$i] = $index[$i];
          }
        }
      }
     
     
      function ChangeUrl($value, $index) {
        $this->Change($value, $index, , $this->Urls);
      }
    Que je pose $indexname = $this->Urls;
    ou que je pose $indexname='Urls' et que je rédige la ligne buggée
    avec une expression essayant de répliquer les variables de variables
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset(count(${this->$indexname}))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset(count($this->.${'indexname'})))
    cela foire lamentablement.

    Ce genre de syntaxe est t'elle tout bonnement impossible ?
    Le problème de vient t-il pas d'une absence de déclaration des attributs en format talbeau mais bon, si je pose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    settype(($this->$Urls), array());
    ... ça foire.

    Y a t'il un moyen radicalement différent de traiter ce problème : à savoir avoir une méthode générique Change rédigée sous forme d'une unique fonction (car les traitements à effectuer sur les différents attributs sont identiques)

    Merci de votre aide

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 349
    Points : 15 695
    Points
    15 695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if (isset(count($indexname)))) {:bug:
    tu ouvres 3 parenthèses et tu en fermes 4, d'où l'erreur de syntaxe
    ensuite la fonction "count" retourne un nombre donc la condition "isset" sera toujours vrai

    quand ces problèmes seront résolus on pourra voir ton problème de POO

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Effectivement le isset(count()) foutait tout par terre. (Merci d'ailleurs)

    Le problème de variable de variable ne se pose plus puisque j'ai créé une nouvelle classe Storage contenant la méthode suivante :

    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
    Function ValueToMatrix($value, $values, $matrix) {
      $nbindex = count($index);
      if (isset($matrix)) {
        $row = count($matrix);
        $matrix[$row][0] = $value;
        for ($i=0; $i<$nbindex; $i++) {
          $matrix[$row][$i+1] = $values[$i];
        }
      }
      if (!isset($matrix)) {
        $matrix[0][0] = $value;
        for ($i=0; $i<$nbindex; $i++) {
          $matrix[0][$i+1] = $values[$i];
        }
      }
    }
    Et que j'instancie cet objet dans la méthode de ma classe initiale où ce code était en dur.

    Reste que je n'ai plus besoin d'utiliser une syntaxe de type ${var}. Mais pour info quelqu'un sait t-il si ce type de syntaxe permettant de variabliser le nom de la variable serait valable et possible pour appeler un attribut d'une classe d'une façon variable à l'intérieur d'une méthode de cette classe ?

    A priori je ne pense pas car, un truc du style ${this->var} semble incorrect, et, en y réflichissant, il semble que le seul moyen est d'avoir une méthode dédiée au sein de la classe qui détermine l'attribut sur lequel agir en fonction d'un paramètre d'entrée. Mais sait t-on jamais ? Si quelqu'un sait...

  4. #4
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Ce code fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class C {
      var $dynvar = 'var';
      var $var = '42';
      function f() {
        return $this->{$this->dynvar};
      }
    }
    $c = new C;
    echo $c->f(); // 42
    Est-ce ce que tu recherches ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Oui, c'est exactement ce que je cherchais et je constate qu'en plus ton code avec tableaux fonctionne également. Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class C {  
    var $dynvar = array('var','var2'); 
    var $var = array('42','3');
    var $var2 = array(array('5','6','7'), array('8','9','10'));
    function f() {
      $index = 1;  
      return $this->{$this->dynvar[$index]}[1][0]; 
    } 
    } 
     
    $c = new C; 
    echo $c->f(); // 8

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  2. [WD17] poo : comportement des membres globaux (static) d'une classe
    Par lmontout dans le forum WinDev
    Réponses: 5
    Dernier message: 26/12/2012, 12h21
  3. Réponses: 7
    Dernier message: 12/11/2011, 15h09
  4. [POO] Accéder à un attribut d'un objet via une variable
    Par iLoLo21 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/11/2008, 12h36
  5. Réponses: 2
    Dernier message: 17/04/2007, 17h14

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