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 :

Variables dynamiques qui ne fonctionnent pas


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut Variables dynamiques qui ne fonctionnent pas
    Bonjour,

    je suis actuellement en cours de développement d'un moteur de templates (avec cache et gestion des erreurs).

    Si le problème suivant est corrigé il ne me restera plus que la gestions des erreurs à faire!

    Rentrons dans le vif du sujet, voici mon problème:

    j'utilise une fonction qui assigne les différentes clés avec leurs valeurs de remplacement.
    cette fonction fonctionne très bien, mais est d'une lourdeur dans le code. En effet il faut utiliser la fonction "assigner" pour chaque clés et chaque valeurs...
    Il m'est donc venu l'idée d'automatiser le tout. (Mais quel idée grandiose! )
    Mais pour automatiser ça il me faut repérer les variables et connaitre leurs clés...
    le plus simple que j'ai pu trouver est de déclarer mes variables avec un nom particulier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $template_cle_valeurOptionnelle
    J'ai donc réussi à récupéré les noms de variables (avec fopen, fgets, fclose...) et à en extraire les clés et les stocker dans deux array différents (un pour les clés, l'autre pour les noms de variables).
    Viens le moment d'utiliser la fonction assigner dans une boucle, et à ce moment ça plante sur les variables dynamiques.
    La fonction assigner prend deux paramètres et ne renvois rien. Les deux paramètres sont, vous vous en douttez, la clé et la valeur de remplacement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assigner("clé", "valeur de remplacement");
    ainsi je doit faire une petite boucles pour passer toute les valeurs du tableau comme ce ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $keys = $this->addKeyNames();
    $varNames = $this->addVarNames();
     
    for ($i = 0; $i < count($keys); $i++)
        {
            $this->assigner($keys[$i], ${$varNames[$i]});
        }
    sachant que les noms de variables contenu dans l'array varNames on été déclaré précédemment (avant l'appel de la fonction).

    le seul problème c'est que ${$varNames[$i]} ne veux rien afficher.
    tandis qu'un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $haha = "youpi";
    $hehe = "super";
     
    $test = Array("hehe", "haha");
     
    for( $i = 0; $i < count($test); $i++)
        {
            echo ${$test[$i]};
        }
    fonctionne parfaitement...

    j'ai du mal à comprendre d'où viens le problème.

    Merci de votre aide (et excusez moi de l'orthographe. )
    Gwennin

    Edit : J'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo eval("$".$varNames[1].";");
    La fonction eval execute une chaine comme du code php.
    ça n'affiche rien. Je pense vraiment que ça viens du fait que mes nom de variables ne sont pas synchro avec l'appel de ${$varname[1]};

    Edit: Sujet Résolut! des métacaractères trainaient... mais avec la fonction rtrim tout est rentré dans l'ordre!

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut
    J'ai parlé trop tôt:
    "tout est rentré dans l'ordre", Ou presque:

    ma fonction automaticAssign() fonctionne très bien si je l'utilise en dehors de ma class assign mais pas à l'intérieur...
    voici le code de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $keys = $assign->addKeyNames();
    $varNames = $assign->addVarNames();
     
    for ($i = 0; $i < count($keys); $i++)
        {
            $template->assigner($keys[$i], ${$varNames[$i]});
        }
    sachant que $assign est $this dans ma class (normal) et que j'ai appliqué des rtrim sur les return de addVarNames et addKeyNames...

    C'est exactement le même code (j'ai fait un zoli Ctrl+C Ctrl+V) pourquoi ma fonction plante mais pas son code???
    Je n'ai jamais vu quelque chose d'aussi space dans du code...

  3. #3
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    As tu testé de voir ce que tu as dans ta variables $varNames ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    echo '<pre>';
    var_dump($varNames);
    echo '</pre>';
    ?>
    Dans le cas de ton eval, tu as un soucis.
    Dixit le manuel PHP :
    Valeurs de retour

    eval() retourne NULL sauf si return est appelé dans le code évalué, auquel cas la valeur passée à return est retournée. Dans le cas d'une erreur de syntaxe dans le code évalué, eval() retourne FALSE et l'exécution du code suivant continue normalement. Il n'est pas possible d'attraper l'erreur d'analyse de la fonction eval() en utilisant la fonction set_error_handler().
    Il faut que tu fasse plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    eval("echo $".$varNames[1].";");
    ?>

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut
    voici ce que me retourne la fonction var_dump() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(2) { [0]=>  string(10) "template_cle" [1]=>  string(11) "template_test" }
    donc ce que contient $varNames est correct.

    pour le eval, je te remerci, c'est une belle erreur! quand je relis je m'en rend compte!

    Mais je ne l'utilise plus, je ne l'ai essayé que pour faire des tests

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut
    Mes recherches avances:

    j'ai changé ma class assign pour quelle hérite de la class template.

    maintenant je suis sur qu'il rentre et qu'il utilise ma fonction assigner() dans la fonction automaticAssign().

    voici la fonction assigner():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function assigner($cle, $valeur)
        {
            $cle = $this->addInComment($cle);
            array_push($this->VariablesAssigneesCle, $cle);
            array_push($this->VariablesAssigneesValeur, $valeur);
        }
    La fonction addInComment() me permet de repérer ou se trouves les clés dans le template grâce au & qui les précèdes.

    L'erreur qui est renvoyé par cette fonction est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: array_push() [function.array-push]: First argument should be an array in (...)
    j'ai donc remplacé les deux lignes par celles ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->VariablesAssigneesCle[] = $cle;
    $this->VariablesAssigneesValeur[] = $valeur;
    qui ne me fait plus aucune erreurs "Apache" mais qui n'arrange pas plus la situation: aucune sortie correcte n'est observable sur mon rendu de template...

    J'ai donc récupéré le var_dump de VariablesAssigneesValeur qui me renvoi un petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(1) { [0]=>  NULL }
    Ainsi lors de mon appel de fonction $valeur est égal à NULL.

    je refait un tours vers ma fonction automaticAssign() et je recupere le var_dump de ${$varNames[$i]}
    Vous ne vous en douterez jamais: encore un NULL!
    je fait donc un var_dump (moi fan de cette fonction??? meuuh non! ) sur le return de ma fonction addVarNames() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(2) { [0]=>  string(10) "gabari_cle" [1]=>  string(11) "gabari_test" }
    OUFFF! ça fonctionne!

    le problème viens donc de ma fonction automaticAssign() quand elle récupère l'array de retour de addVarNames...
    On retourne à cette fonction!

    je fait donc trois var_dump sur (respectivement) :
    1. $varNames
    2. $varNames[1]
    3. ${$varNames[1]}

    ça me donne respectivement:
    1. array(2) { [0] => template_cle [1] =>template_test }
    2. template_test
    3. NULL


    mais si je met dans le même fichier que celui de test: il y a deux cas.
    1. le code en dehors d'une fonction fonctionne;
    2. le code à l'interieure d'une fonction n'est pas exécuté


    je vous avouerais que j'ai du mal à piger d'où viens le problème...
    pourtant ma fonction est correcte:
    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 hehe()
        {
            $keys = $assign->addKeyNames();
            $varNames = $assign->addVarNames();
     
            for ($i = 0; $i < count($keys); $i++)
                {
                    $assign->assigner($keys[$i], ${$varNames[$i]});
     
                    $tmp = rtrim($varNames[$i]);
                    return var_dump($$tmp).'<br />';
                 }
        }
     
    echo hehe();

Discussions similaires

  1. Tableau dynamique qui ne fonctionne pas
    Par Pouknouki dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/12/2013, 14h50
  2. Variable SESSION qui ne fonctionne pas sous IE et FF
    Par tardmonkey dans le forum Langage
    Réponses: 7
    Dernier message: 13/06/2013, 10h07
  3. [CS5] Texte dynamique qui ne fonctionne pas avec tous les chiffres
    Par Shikam dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 10/12/2010, 07h17
  4. Variable globale qui ne fonctionne pas
    Par the-morpher dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/03/2009, 22h01
  5. Variable session qui ne fonctionne pas
    Par sheira dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2009, 19h04

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