3- Les fonctions

Les fonctions en php sont définies par le mot-clé function. La signature de la fonction est composée du mot-clé function, du nom de la fonction, des paramètres et du type de retour.

La structure d’une fonction en PHP7 est la suivante :

function maFonction (string $param1, int $param2) : int{
   // corps de la fonction
   return 5;
}

Une fonction effectue un traitement, une action. Elle peut prendre zéro ou plusieurs paramètres. Elle peut prendre en paramètre des variables, des fonctions, des valeurs par défaut, des références.

Elle peut ou non retourner une valeur. Pour retourner une valeur, il faut utiliser le mot-clé return. Si la fonction ne retourne (par exemple si elle sert simplement à afficher quelque chose à l’écran, ou que les paramètres sont passés par références) on dit que son type est void (aucun retour).

Lorsque le passage des paramètres n’est pas fait par référence, les arguments de la fonctions sont passés par copie, ce qui veut dire que toute modification effectuée sur ces-derniers ne modifiera pas les variables passées lors de l’appel de la fonction (et simplement leur copie au sein de la fonction). Lorsque l’on passe un argument par défaut, il n’est pas nécessaire de renseigner l’argument puisqu’il prendra sa valeur par défaut.

Par exemple:

function maFonction (string $param1 = 'aa', string $param2 = 'bb') : string
{
   // corps de la fonction
   return $param1 . $param2;
}
echo maFonction(); // affiche aabb

On peut définir des fonctions anonymes (qui n’ont pas de nom - pratiques pour passer en paramètre d’une autre fonction, en callback), mais également définir une fonction dans le corps d’une fonction. Mais attention, il faut utiliser les fonctions anonymes (ou lambda) avec parcimonie car elles nuisent grandement à la lisibilité du code.

Par exemple :

echo preg_replace_callback('~-([a-z])~', function ($match) {
   return strtoupper($match[1]);
}, 'bonjour-le-monde');

Lorsqu’une fonction est propre au comportement d’une classe, on l'appelle alors une méthode (nous verrons ça dans le cours orienté objet) .

Il existe des fonctions implémentées par défaut dans PHP, c’est à dire qu’on n’a pas besoin de les définir avant de les utiliser (parce qu’elles ont déjà été définies). Exemple count(), str_replace() etc…

Les fonctions récursives

Les fonctions récursives ont la particularité de s’appeler elles-mêmes. Elles sont pratiques lors de calculs récursifs (par exemple pour parcourir des dossiers), et doivent impérativement contenir une condition de sortie pour ne pas créer de boucle infinie.

Exemple sur une incrémentation :

function add1To5(int $number) : int
{
   echo strval($number);
   if($number < 5){
       $number++;
       add1To5($number);
   }
   return $number;
}

$a = add1To5(1); //affiche 12345

Dans cet exemple, nous vérifions que l’entier est inférieur à 5, et si c’est le cas, nous lui ajoutons 1 et nous le repassons en paramètre de la fonction. Chaque passage dans la fonction crée un niveau supplémentaire de récursivité (qui ajoute 1 jusqu’à ce que notre variable vale 5), et le système doit copier à chaque fois tout ce qui compose chaque niveau (l’intégralité de la fonction et de ses variables locales) pour pouvoir effectuer l’opération du dernier niveau puis redescendre jusqu’au premier : cela est très coûteux en mémoire et il est, la plupart du temps, déconseillé d’utiliser des fonctions récursives. Comme le système ne peut pas savoir à l’avance combien de niveau de récursivité l’opération peut atteindre, le programme peut s’arrêter si la pile (la mémoire) est remplie.