Forum Programmation.php Nom de Variable...Variable !

Posté par .
Tags : aucun
0
23
oct.
2008
Bonsoir/Bonne Nuit tous !

Je suis face à une question très philosophique concernant PHP...

comment faire ce-ci : $$page[$i] ? ^^

Ouais bon, je sais ça crains comme syntaxe. Voici d'ou vient mon problème :

for ($i=0; $i<=$c; $i++){
$tpl->set_var('index', $index[$i]);
}


Sauf que.... suivant dans quel contexte ce code va s'exécuter, ça ne sera pas toujours "index" le nom de la page, et pas toujours "index" le nom du tableau. Et donc, le nom de cette page et le nom de ce tableau étant les mêmes, et variant de la même façon dans le même contexte, j'ai pensé stoker ce nom dans une variable $page.... Ce qui donne :

$$page[$i]

Évidement ça ne marche pas.

Vos conseils avisés sont les bienvenus, merci.
  • # variables variables

    Posté par . Évalué à 2.

    Comme ça:
    ${$page}[$i]

    Ou comme ça, si $$page est une globale:
    $GLOBALS[$page][$i]

    Mais il y a probablement une meilleur solution que les variables variables ;)
  • # utiliser un tableau

    Posté par . Évalué à 2.

    tu peux peut etre utiliser un tableau pour regrouper toutes les données dont tu auras besoin ?

    $tab = array('index' => $index);

    ce qui permet d'appeler

    $tpl->set_var($page, $tab[$page][$i]);
  • # ben

    Posté par (page perso) . Évalué à 2.

    Pour faire $$page[$i] il suffit de le faire, ça fonctionne.

    Après peut être que la priorité n'est pas celle que tu souhaites.

    Suivant ce que tu veux faire tu peux :

    * le [$i] s'adresse à $page :

    ${$page[$i]} ou aussi $tmp=$page[$i]; $$tmp ;

    * le [$i] s'adresse à $$page :

    ${$page}[$i] ou aussi $tmp=$$page; $tmp[$i] ;


    Maintenant 9 cas sur 10 où j'ai vu des variables variables, c'était une erreur. Tu as quasiment toujours intérêt à utiliser une autre structure.
    • [^] # Re: ben

      Posté par . Évalué à 1.

      Hummm...

      Bon, je viens de faire le changement en ${$page}[$i]. Ca marche...

      Qu'est ce qu'il faut que j'utilise comme structure? Le tableau ne me convient pas parce que je veux un truc dynamique. Pour l'instant il y disons 10 pages... ce qui voudrait dire 10 entrées dans le tableau. Mais après? Chaque fois que je vais créer une page, je vais devoir modifier mon tableau... Ca ne me convient pas, je suis faignant. :-)
      • [^] # Re: ben

        Posté par (page perso) . Évalué à 3.

        Je ne comprend pas, tu ne nous montres qu'une partie de la question.

        Mais déjà nommer des variables avec un nom qui dépend d'une action, d'une entrée utilisateur ou de quoi que ce soit de non fixe, c'est une mauvaise idée.

        Là où tu es capable de créer $index tu es capable de créer $page['index'] non ?
        C'est même presque du rechercher/remplacer

        Je vois pas bien où créer 10 variables (ou plus) serait "plus simple" que créer 10 entrées (ou plus) dans un tableau, même pour quelqu'un de très fénéant

        je continue de penser que tu prend ton problème par le mauvais bout (mais comme je ne comprend pas ton problème fonctionnel, je serai bien à mal de te proposer autre chose)
        • [^] # Re: ben

          Posté par . Évalué à 1.

          Ok... Tant pis, je vais pourrir le forum avec une tonne de code :-)

          Index.php :


          include('./includes/functions.php');
          print_text('index', 'index.html');


          functions.php :


          function print_text($page_name, $page){

          global $tpl;

          //on inclue les templates
          include('./includes/template.inc');
          $tpl = new Template('./template/'.$_SESSION['style'].'/');
          $tpl->set_file('header', 'header.html');
          $tpl->set_var(array(
          'header_title' => 'WebGiftList',
          'title' => 'Listes de cadeaux',
          'style' => $_SESSION['style'],
          'compteur' => $meter));
          $header = $tpl->parse('result','header');

          $tpl->set_file($page_name, $page);
          $tpl->set_var('header', $header);

          include('includes/config.inc.php');

          //Inclusion de la page contenant les textes
          include('./lang/'.$LANG.'/'.$LANG.'_'.$page_name.'.php');

          $c = count(${$page_name});

          for ($i=0; $i<=$c; $i++){
          $tpl->set_var($page_name.'_'.$i, ${$page_name}[$i]);
          }

          }


          index.html:

          {index_0}


          Voila ! J'espère que ça suffira pour comprendre le problème...

          En tout cas, merci de votre aide.
          • [^] # Re: ben

            Posté par (page perso) . Évalué à 1.

            Il y a un truc que je ne comprend pas bien dans ton code:

            $c = count(${$page_name});

            C'est équivalent (lors de l'appel de la fonction) à:

            $c = count($index);

            parce que $page_name="index"; Mais d'où sort la variable $index ? Elle n'a été définie nulle part, ce n'est pas une variable locale et tu ne peux pas y accéder comme variable globale car elle n'est pas référencée dans une instruction 'global' ?

            Sinon, si tu veux bien programmer en PHP, je te conseille de systématiquement faire :

            error_reporting(E_ALL);

            Cela va afficher toutes les erreurs, même les erreurs E_NOTICE. Et finalement le code sera beaucoup plus propre (devrait, en PHP on n'est jamais sûr).
            • [^] # Re: ben

              Posté par . Évalué à 1.

              Le rapport d'erreur ne m'affiche que des erreurs sur les sessions...

              Et je n'ai pas de variable $index dans mon code.

              dans l'exemple, j'appelle la fonction print_text() avec l'argument 'index'. Mais à un autre moment dans le code, je vais l'appeler avec l'argument 'addlist'.... C'est pour ça qu'il faut que le tout soit dynamique et que je ne peux utiliser une variable $index. Parce que au prochain appelle de la fonction, ma variable ne devras plus être $index, mais $addlist.
          • [^] # Re: ben

            Posté par . Évalué à 1.

            Arrete moi si je me trompe ,
            mais ${$page_name} est sensé repésenté un tableau, tableau qui est déclaré dans ton fichier lang .

            J'imagine tu veux remplacer dans ton templates tous les champs:
            champ_1 par contenu de ton tableau index1
            champ_2 par contenu de ton tableau index2

            Je ne comprends pas pourquoi tu ne donne pas le même nom (eg: $lang) à tes tableaux (indiqué dans tes fichiers de langues).
            Qui du coup te simplifirai ton code:
            $tpl->set_var($page_name.'_'.$i, $lang[$i]);

            sachant que :
            fr_index.php contiendrai

            $lang[0]="champ 1";
            $lang[1]="champ 2";
            etc...

            et us_index.php:

            $lang[0]="field 1";
            $lang[1]="field 2";
            etc..

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.