Articles

Le mois de la fonction PHP : fonctions dynamiques

  • Ecrit par Damien Seguy
  • samedi 28 avril 2007
Image pour le titre du contenu

This document is also available in English en 


En PHP, les variables et les fonctions peuvent être appelées dynamiquement. Pour les variables, il faut mettre le nom de la variable dans une chaîne, et doubler le nombre de signe dollar. Pour les fonctions, il faut mettre simplement faire suivre la variable de parenthèses et des arguments.
<?php
 
 
$fonction = 'var_dump';
$fonction('x');
 
 
?>

string(1) "x"


Notez qu'il est parfaitement possible d'appeler des fonctions de PHP de cette manière. Il existe malgré tout une exception : les structures de langages. Observez donc :

<?php
 
 
$fonction = 'var_dump';
$fonction('x');
 
 
$fonction = 'print';
$fonction('x');
 
 
 
?>
 
 
string(1) "x"
PHP Fatal error:  Call to undefined function print() 
in script.php on line 11
 
 
Fatal error: Call to undefined function print() 
in script.php on line 11


Si vous croyez que mon PHP ne supporte pas la fonction print, vous vous trompez lourdement. En fait, certaines fonctions de PHP ont un statut particulier de structure de langage : techniquement parlant, ce ne sont pas des fonctions, même si elles en en tous les attributs classiques. empty() et echo() sont dans cette catégorie.

Pour utiliser dynamiquement ces fonctions, il faut passer par la création d'une fonction intermédiaire.
<?php
 
 
function mon_print($x) {
    print $x;
}
 
 
$fonction = 'mon_print';
$fonction('x');
 
 
?>

Les fonctions dynamiques peuvent être aussi appelées avec une fonction : call_user_func(). Cette fonction prend comme premier argument le nom de la fonction sous forme de chaîne de caractères, et les arguments commes arguments suivants.

<?php
 
 
$fonction = 'var_dump';
$fonction('x');
 
 
call_user_func('var_dump', 'x');
 
 
?>

Les deux exemples ci-dessus sont parfaitement identiques, et fonctionnent de la même façon. La deuxième version rend le code plus explicite, mais moins compact.

La deuxième version dispose d'une proche cousine, plus puissante : call_user_func_array(). Le suffixe _array indique que les arguments qui seront passés à la fonction appelée sont à présenter sous forme d'un tableau, en deuxième argument. Comme ceci :

<?php
 
 
call_user_func('fonction', range('a','z'));
 
 
function fonction() {
    $args = func_get_args();
    
    print_r($args);
}
 
 
?>

Désormais, il est possible de faire des appels à une fonction, avec un nombre variable d'arguments, comme les accepte déjà array_merge, par exemple. Au passage, notez l'utilisation de func_get_args() pour obtenir la liste variable des arguments de la fonction.

A noter

  • il est possible d'appeler dynamiquement une méthode statique en utilisant un tableau : le premier élément est le nom de la classe, et le deuxième est le nom de la méthode.
  • il est possible d'appeler dynamiquement une méthode d'un objet en utilisant un tableau : le premier élément est l'objet, et le deuxième est le nom de la méthode.
  • Pour les objets, on peut simplement utiliser la notation dynamique. Cela ne marche pas pour les classes.
< Précédent   Suivant >

Vous devez vous connecter pour commenter