Stocker des fonctions à argument dans un array

Petit nouveau ! | 5 Messages

06 mai 2013, 02:31

Bonjour à tous,

Y a-t-il un moyen simple de faire ceci ?
$foo = array(
  'lorem' => function_one('argument'),
  'ipsum' => function_two('argument')
);

/* exécuter function_one (ou two) en l'appelant depuis l'array */
Je sais qu'il est possible de faire :
$foo = array(
  'lorem' => 'function_one',
  'ipsum' => 'function_two'
);

$foo['lorem']();
Mais ça ne résout pas le problème étant donné qu'il n'est pas possible de directement passer un argument aux fonctions appelées de la sorte.

Une idée ?

Merci d'avance,
Nisp.

Mammouth du PHP | 568 Messages

06 mai 2013, 15:04

Regarde les Closure (fonctions anonyme)

Petit nouveau ! | 5 Messages

06 mai 2013, 16:22

Bonjour,

Merci pour ta réponse. Pourrais-tu me donner un exemple ? Car j'ai du mal à voir le rapport avec la question :?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 mai 2013, 11:48

Regarde du côté de call_user_func() :
if( !is_callable($foo['lorem']) ) {
    throw new RuntimeException('Impossible to call function "'.$foo['lorem'].'"');
}
call_user_func($foo['lorem'], 'argument');
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 5 Messages

11 mai 2013, 00:28

Bonjour,

Merci pour ta réponse.
Regarde du côté de call_user_func()
J'avais déjà regardé du côté de call_user_func() mais, dans ce cas encore, impossible de stocker les fonctions et leurs arguments directement dans un array.

L'idée (simplifiée), c'est de pouvoir faire ceci :
$foo = array(
  'lorem' = function_one('argument'),
  'ipsum' = function_one(),
  'dolor' = function_two()
);
C'est dans le cadre d'un fichier de config : les clés du tableau sont les commandes qui sont interceptées par un bot ; la valeur associée est, quant à elle, la fonction à exécuter. Il est nécessaire que les arguments soient fournis au niveau de cet array pour éviter d’alourdir le code.

C'est peut-être mon procédé qui est initialement mauvais, si vous voyez d'autres solutions, je suis preneur.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 mai 2013, 14:07

Mauvais systèmes pourquoi pas c'est assez étonnant d'imposer des noms de fonction et des arguments dans un fichier de conf alors qu'il ne devrait y avoir que les couples clef / argument.

Ensuite tu peux utiliser les noms dynamiquement ( $var('argument'); ) avec dans $var le nom de fonction issue du fichier de conf.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 13 Messages

11 mai 2013, 14:39

Et par objet ?
class foo {
  public static function lorem($argument) {
    echo "LOREM : ".((!is_null($argument)) ? $argument : "Pas d'argument");
  }
  public static function dolor() {
    self::lorem(null);
  }
  public static function ipsum($argument) {
    echo "IPSUM : $argument";
  }
}

foo::lorem('toto');  // affiche "LOREM : toto"
foo::dolor();        // affiche "LOREM : Pas d'argument"
foo::ipsum('toto'); // affiche "IPSUM : toto"