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 :

Exécuter une fonction contenue dans un string


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut Exécuter une fonction contenue dans un string
    Bonjour,

    j'ai un énorme tableau, dans lequel j'ai une liste de fonctions à exécuter selon un code particulier (clé "cod") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tableau_fonctions = array(
    	array("lib" => "libelle1", 
    	    "cod" => "code1",
    	    "nb1" 	=> 'fonction1($par1, $par2)',
    	    "nb2" 	=> 'fonction2($par3, $par4)'),
    	array("lib" => "libelle2", 
    	    "cod" 	=> "code2",
    	    "nb1"	=> 'fonction3($par5, $par6)',
    	    "nb2"	=> 'fonction4($par7, $par8)'),
    	array("lib" => "libelle3", 
    	    "cod" => "code3",
    	    "nb1" => 'fonction5($par9, $par10)',
    	    "nb2" => 'fonction6($par11, $par12)')
    je précise que mon tableau est beaucoup plus gros que celui-là..

    dans un autre tableau je récupère la liste des codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau_codes = array('code1', 'code3');
    Grâce à cette liste, je voudrais pouvoir exécuter les fonctions associées à chaque code, dans mon exemple je voudrais récupérer les résultats des fonctions fonction1, fonction2, fonction5 et fonction6. J'arrive à récupérer la chaîne de caractères contenant la fonction, mais n'arrive pas à exécuter la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($tableau_codes as $key_code => $value_code) {
       foreach ($tableau_fonctions as $key_fonc => $libelle_fonc) {
         if (in_array($value_code, $libelle_fonc))
         {
            $res = $libelle_fonc['nb1'](); //erreur : Call to undefined function fonction1($par1, $par2)()
    	break;
         }
       }
    }
    j'espère que quelqu'un pourra m'aider !
    Merci.

  2. #2
    Membre actif Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Points : 242
    Points
    242
    Par défaut
    Ou est-ce que la fonction se trouve définie ?.

    Est-ce qu'il y'a eu un include préalable de toute ces fonctions ?.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    A cause des paramètres, c'est cuit. L'appel dynamique à une fonction est possible mais uniquement à partir de son nom (sans les paramètres à ce moment). C'est au moment de l'invoquer, qu'on fournit ceux-ci (syntaxe $nom($param1, ... $paramN) que vous cherchiez à utiliser comme via les fonctions call_user_func et call_user_func_array).

    Il doit donc rester eval ou un traitement de cette chaîne :
    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
    $par1 = (object) array('x' => 3, 'y' => 'toto');
    $par2 = 'foobar';
     
    function fonction1($a, $b, $c) {
        echo __FUNCTION__;
        var_dump(func_get_args());
        return str_repeat($a->y, $a->x);
    }
     
    $call = 'fonction1($par1, $par2, 3)';
    list($func, $vargs) = explode('(', $call);
    $vargs = preg_split('~[ ,)]~', $vargs, -1, PREG_SPLIT_NO_EMPTY);
    $args = array();
    foreach ($vargs as $v) {
        if ($v[0] == '$') {
            $args[] = ${substr($v, 1)};
        } else {
            $args[] = $v;
        }
    }
    var_dump(call_user_func_array($func, $args));
    (c'est juste pour illustrer)

  4. #4
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Ou est-ce que la fonction se trouve définie ?.
    Est-ce qu'il y'a eu un include préalable de toute ces fonctions ?.
    oui j'ai un require_once au début du fichier

    A cause des paramètres, c'est cuit....(c'est juste pour illustrer)
    ça fonctionne presque
    J'ai créé une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function transforme_chaine_fonction(&$fonction, &$params, $chaine)
    {
       list($fonction, $vargs) = explode('(', $chaine);
       $vargs = preg_split('~[ ,)]~', $vargs, -1, PREG_SPLIT_NO_EMPTY);
       $params = array();
       foreach ($vargs as $v) {
          if ($v[0] == '$') {
             $params[] = ${substr($v, 1)};
          } else {
             $params[] = $v;
          }
       }
       return true;
    }
    et j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach ($tableau_codes as $key_code => $value_code) {
       foreach ($tableau_fonctions as $key_fonc => $libelle_fonc) {
         if (in_array($value_code, $libelle_fonc))
         {
            transforme_chaine_fonction($func, $args, $libelle_fonc['nb1']);
            call_user_func_array($func, $args);
    	break;
         }
       }
    }
    Lorsque je passe la 1ère fois dans la fonction transforme_chaine_fonction() pour transformer fonction1($par1, $par2), j'ai l'erreur "Notice: Undefined variable: par1" alors qu'il est défini une ligne au-dessus de ma fonction..peut-être que c'est parce que je suis dans le corps d'une fonction ??

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par ninikkhuet Voir le message
    Lorsque je passe la 1ère fois dans la fonction transforme_chaine_fonction() pour transformer fonction1($par1, $par2), j'ai l'erreur "Notice: Undefined variable: par1" alors qu'il est défini une ligne au-dessus de ma fonction..peut-être que c'est parce que je suis dans le corps d'une fonction ??
    Oui, il y a certainement une question de portée ici. Tout dépend où sont définies ces fameuses variables, mais si elles sont hors de cette fonction, elles lui seront inconnues.

    Si vous voulez conserver une telle implémentation pour effectuer ce traitement, il faudra alors adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $params[] = ${substr($v, 1)};
    En :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $params[] = $GLOBALS[substr($v, 1)];

  6. #6
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    ça fonctionne nickel
    merci !

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

Discussions similaires

  1. [XL-2007] Utiliser une fonction contenue dans une cellule
    Par Karrig dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 28/12/2009, 10h26
  2. [POO] appeler une fonction contenue dans une autre fenetre
    Par pepper18 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/09/2008, 02h27
  3. Executer une methode contenue dans un string ?
    Par Sylk dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/06/2008, 21h46
  4. Réponses: 2
    Dernier message: 28/11/2007, 17h49
  5. appel d'une fonction contenu dans un fichier js
    Par geoman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/08/2007, 07h51

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