Meilleur pratique du PHP – Episode 3

Les paramètres facultatifs

J’en suis sûr, vous vous êtes déjà demandé pourquoi certaines fonctions (comme print_r présenté au dernier épisode) avait un ou plusieurs arguments facultatifs (que l’on n’est pas obligé de donner à la fonction pour qu’elle fonctionne), et surtout, comment c’était possible. Aujourd’hui, vous allez enfin savoir!
Prenons par exemple la fonction saluerVisiteur qui va vous servir à saluer les visiteurs :

<?php
function saluerVisiteur($nom = 'anonyme')
{
   echo 'Bonjour '.$nom;
}
saluerVisiteur(); // affiche : Bonjour anonyme
saluerVisiteur('Pierre'); // affiche : Bonjour Pierre
?>

La syntaxe est très simple : si vous voulez que l’argument soit facultatif, il suffit de lui “affecter” la valeur par défaut dans la liste des arguments.
Attention, il est très important de mettre les arguments facultatifs à la fin de la liste des arguments. Sinon la fonction ne marchera pas bien.
Par exemple :

<?php
function servirCafe($nom = '', $type)
{
   echo 'Voici votre '.$type.', monsieur '.$nom.'.';
}
servirCafe('Berdes', 'cappuccino'); // affiche : Voici votre cappuccino, monsieur Berdes.
servirCafe('expresso'); // affiche : PHP Warning:  Missing argument 2 for servirCafe(), called in /chemin/vers/le/fichier.php
?>

Comme vous pouvez le voir, php ne peut pas savoir si c’est l’argument facultatif ou bien l’argument non facultatif ;) , c’est pour ça qu’il faut toujours mettre les arguments facultatifs à la fin de la liste des arguments.
Voici donc la même fonction, qui va marcher :

<?php
function servirCafe($type, $nom = '')
{
   echo 'Voici votre '.$type.', monsieur '.$nom;
}
servirCafe('cappuccino', 'Berdes'); // affiche : Voici votre cappuccino, monsieur Berdes
servirCafe('expresso'); // affiche : Voici votre expresso monsieur
?>

Nombre variable d’arguments

Encore quelque chose de très utile : la possibilité d’avoir un nombre d’argument variable! Ça peut être très utile, si vous voulez faire la moyenne des arguments de la fonction, ou de manière plus général, si vous voulez créer une fonction qui pourra avoir un nombre variable (souvent infini) d’arguments.
Pour cela, il va falloir découvrir trois fonctions : func_get_arg(), func_get_args() et func_num_args(). Ces fonctions doivent êtres appelés à l’intérieur d’une fonction si vous ne voulez pas avoir d’erreurs.

func_get_arg($arg_num)

Cette fonction renvoie l’argument numéro $arg_num (les arguments sont numérotés à partir de 0, comme les arrays) :

<?php
function fonctionInutile()
{
   echo 'Le premier argument est : '.func_get_arg(0);
}
fonctionInutile('bonjour'); // affiche : Le premier argument est : bonjour
?>

Comme vous pouvez le voir, je n’ai pas mis d’arguments dans la déclaration de la fonction, vu que je ne sait pas combien la fonction en recevra.
Si vous demander un argument qui n’a pas été envoyé à la fonction, vous aurez droit à une erreur.

func_num_args()

Cette fonction est complémentaire avec func_get_arg(). Elle renvoie le nombre d’arguments passés à la fonction :

<?php
function fonctionInutile()
{
   echo 'La fonction a reçu '.func_num_args().'arguments';
}
fonctionInutile('bonjour', 'au revoir'); // affiche : La fonction a reçu 2 arguments
?>

Là encore, je n’ai mis aucun arguments dans la déclaration de la fonction.

func_get_args()

Et voici les deux fonction présenté précédemment pour le prix d’une! ^^ En effet, cette fonction va renvoyer la liste des arguments sous forme d’un array :

<?php
function fonctionInutile()
{
   echo 'Les arguments de la fonction sont : '.print_r(func_get_args(), true);
}
fonctionInutile('bonjour', 'au revoir');
/* Affiche :
Les arguments de la fonction sont :
Array
(
   [0] => bonjour
   [1] => au revoir
)
*/
?>

Avec tout ça, vous allez enfin pouvoir créer facilement des fonctions avec un nombre d’argument variable et on va tester ça tout de suite avec la fonction qui va renvoyer la moyenne des arguments :

<?php
function moyenne()
{
   $arguments = func_get_args();
   $somme = array_sum($arguments);
   return $somme/func_num_args();
}
echo moyenne(18, 10, 13, 8, 15); // affiche 12.8
echo moyenne(150, 10, -18); // affiche 47.333333333333
?>

Et pour faire encore plus puissant, on va créer la même fonction, mais on pourra aussi lui donner un ou plusieurs array(s) en aguments. Dans ce cas, la fonction va faire la moyenne de l’array avant de l’intégrer dans la moyenne calculé. Un exemple de ce que va faire la fonction :
moyenne(2, 8, array(18, 3), 6, array(9, 3, 7, 5, array(9, 38)))
moyenne(2, 8, array(18, 3), 6, array(9, 3, 7, 5, 23.5))
moyenne(2, 8, 10.5, 6, 9.5)
ce qui donne : 7.2

Et voici la fonction :

<?php
function moyenne()
{
   if(func_num_args()==1 AND is_array(func_get_arg(0))) // si il n'y a qu'un seul argument et que c'est un array
   {
      $somme = 0;
      foreach(func_get_arg(0) as $element) // on fait la somme de tous les éléments de l'array
      {
         if(is_array($element))
            $somme += moyenne($element); // si l'élément est un array, alors on fait sa moyenne avant de l'ajouter à la somme
         else
            $somme += $element;
      }
      return $somme/count(func_get_arg(0)); // on retourne la somme divisé par le nombre d'éléments de l'array = moyenne de l'array
   }
   else
   {
      $somme = 0;
      foreach(func_get_args() as $element) // on fait la somme de tous les arguments de la fonction
      {
         if(is_array($element))
            $somme += moyenne($element); // si un argument est un array, alors on fait sa moyenne avant de l'ajouter à la somme
         else
            $somme += $element;
      }
      return $somme/func_num_args(); // on retourne la somme divisé par le nombre d'arguments = moyenne
   }
}
?>

Évidement ce code est beaucoup plus complexe, mais il montre l’utilisation des trois fonctions et montre bien la puissance des fonctions à nombre variable d’arguments.

Un commentaire

  • pifou (1 comments), le 11 novembre 2010

    bonjour,
    sujet intéressant, ça pourrait peut être résoudre mon problème si je ne trouve pas autrement … on peut utiliser des argumments nommés en PHP ?
    par exemple pour une fonction avec les arguments facultatifs, et je veux lui envoyer le 3e mais omettre le 2e donc lui laisser sa valeur par défaut?

Poster un commentaire

Subscribe without commenting