Page 1 sur 1

Stocker des fonctions à argument dans un array

Posté : 06 mai 2013, 02:31
par nispaur
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.

Re: Stocker des fonctions à argument dans un array

Posté : 06 mai 2013, 15:04
par Yosh
Regarde les Closure (fonctions anonyme)

Re: Stocker des fonctions à argument dans un array

Posté : 06 mai 2013, 16:22
par nispaur
Bonjour,

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

Re: Stocker des fonctions à argument dans un array

Posté : 10 mai 2013, 11:48
par zeus
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');

Re: Stocker des fonctions à argument dans un array

Posté : 11 mai 2013, 00:28
par nispaur
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.

Re: Stocker des fonctions à argument dans un array

Posté : 11 mai 2013, 14:07
par moogli
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.


@+

Re: Stocker des fonctions à argument dans un array

Posté : 11 mai 2013, 14:39
par lalmat
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"