Dans cette nouvelle leçon, nous allons donc définir ce que sont les fonctions, comprendre comment elles fonctionnent et apprendre à créer nos propres fonctions.
Définition des fonctions et fonctions internes ou prêtes à l’emploi
Une fonction correspond à une série cohérente d’instructions qui ont été créées pour effectuer une tâche précise. Pour exécuter le code contenu dans une fonction, il va falloir appeler la fonction.
Nous avons déjà croisé des fonctions dans ce cours avec notamment la fonction gettype()
dont le rôle est de renvoyer le type d’une variable.
La fonction gettype()
fait partie des fonctions dites « internes » au PHP ou « prêtes à l’emploi » tout simplement car sa définition fait partie du langage PHP.
En effet, vous devez bien comprendre ici que la fonction gettype()
contient une série d’instructions qui permettent de définir le type d’une variable.
Comme cette fonction a été créée et définie par le PHP lui-même, nous n’avons pas à nous soucier des instructions qu’elle contient : nous n’avons qu’à appeler gettype()
en précisant son nom et le nom d’une variable dont on souhaite connaitre le type dans le couple de parenthèses pour que la série d’instructions qu’elle contient soient exécutées et pour obtenir le type de notre variable.
Les fonctions prêtes à l’emploi sont l’une des plus grandes forces du PHP puisqu’il en existe plus de 1000 qui vont couvrir quasiment tous nos besoins. Nous allons en voir une bonne partie dans la suite de ce cours.
Les fonctions définies par l’utilisateur en PHP
En plus des fonctions internes, le PHP nous laisse la possibilité de définir nos propres fonctions. Cela va s’avérer très pratique dans le cas où nous travaillons sur un projet avec des besoins très spécifiques et pour lequel on va souvent devoir répéter les mêmes opérations.
Pour utiliser nos propres fonctions, nous allons déjà devoir les définir, c’est-à-dire préciser une première fois la série d’instructions que chaque fonction devra exécuter lors de son appel.
Pour déclarer une fonction, il faut déjà commencer par préciser le mot clef function
qui indique au PHP qu’on va définir une fonction personnalisée.
Ensuite, nous allons devoir préciser le nom de notre fonction (sauf dans le cas des fonctions anonymes que nous étudierons plus tard). Le nom des fonctions va suivre les mêmes règles que celui des variables, à savoir qu’il devra commencer par une lettre ou un underscore et ne devra pas être un nom déjà pris par le langage PHP (comme le nom d’une fonction déjà existante par exemple).
En plus de cela, notez qu’à la différence des variables le nom des fonctions est insensible à la casse. Cela signifie que l’utilisation de majuscules et des minuscules ne servent pas à différencier une fonction d’une autre.
Par exemple, si on crée une fonction bonjour()
, les notations BONJOUR()
, bonJOUR()
, etc. feront référence à la même fonction.
Après le nom de notre fonction, nous devons obligatoirement mentionner un couple de parenthèses puis ensuite placer les instructions que la fonction devra exécuter lors de son appel entre des crochets.
Créons immédiatement une première fonction très simple pour voir comment cela fonctionne en pratique :
Ici, nous créons une fonction qu’on appelle bonjour()
dont le rôle est de renvoyer le message « Bonjour à tous » en utilisant un echo
. Bien évidemment, cette fonction n’a pas grand intérêt ici mais il faut bien commencer par quelque chose pour un jour créer des choses complexes !
Une fonction ne va pas s’exécuter toute seule ou « automatiquement » lors du chargement de la page. Au contraire, il va falloir l’appeler quelque part dans le code pour déclencher son exécution. C’est un autre point fort des fonctions puisque cela nous permet de n’exécuter certains codes que lorsqu’on le souhaite dans un script.
Pour appeler une fonction à un point dans notre script, il suffit d’écrire son nom suivi d’un couple de parenthèses. Notez qu’on va pouvoir appeler une fonction autant de fois qu’on le veut dans un script et c’est ce qui fait le plus grand intérêt des fonctions.
En effet, plutôt que d’avoir à réécrire les instructions dans une fonction à chaque fois, il suffit de créer une fonction et de l’appeler autant de fois qu’on le souhaite. Cela peut faire gagner beaucoup de temps de développement et rend le code bien plus facilement maintenable puisque nous n’avons qu’à éditer la définition de notre fonction si on souhaite changer quelque chose dans son fonctionnement.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php function bonjour(){ echo 'Bonjour à tous <br>'; } bonjour(); bonjour(); bonjour(); ?> <p>Un paragraphe</p> </body> </html>
Les paramètres et arguments des fonctions PHP
Souvent, les fonctions vont avoir besoin d’informations qui leurs sont externes, c’est-à-dire d’informations qui ne se situent pas dans la définition de la fonction pour fonctionner correctement.
Par exemple, notre fonction gettype()
va avoir besoin qu’on lui fournisse ou qu’on lui « passe » une variable pour pouvoir déterminer son type.
Les informations qu’on va passer à une fonction sont appelées des arguments. Nous allons toujours passer les arguments dans les parenthèses de notre fonction. Certaines fonctions ne vont pas avoir besoin d’argument pour fonctionner, d’autres vont avoir besoin d’un argument, d’autres encore de deux, etc. Par ailleurs, certains arguments vont parfois être facultatifs tandis que d’autres seront obligatoires.
Quelles différences entre un paramètre et un argument ? On parlera de paramètre lors de la définition d’une fonction. Un paramètre sert à indiquer qu’une fonction va avoir besoin d’un argument pour fonctionner mais ne correspond pas à une valeur effective : ce n’est qu’un prête nom. Un argument en revanche correspond à la valeur effective passée à une fonction.
Vous pouvez retenir ici qu’un paramètre correspond à la valeur générale définie dans la définition d’une fonction tandis qu’un argument correspond à la valeur effective qu’on va passer à la fonction.
Imaginons par exemple qu’on définisse une fonction dont le rôle est de renvoyer « Bonjour + un prénom ». Cette fonction va avoir besoin qu’on lui passe un prénom pour fonctionner correctement.
Dans sa définition, on va donc indiquer le fait que notre fonction va avoir besoin d’une donnée pour fonctionner en précisant un paramètre entre les parenthèses. On peut fournir n’importe quel nom ici. La chose importante va être de réutiliser le même nom dans le code de notre fonction à l’endroit où la fonction s’en sert.
Ensuite, lorsqu’on appelle notre fonction, nous allons lui passer un prénom effectif, soit en lui passant une variable qui contient un prénom, soit en lui passant directement une chaine de caractères. La valeur effective va alors ici remplacer le paramètre de la définition de la fonction et on parle d’argument.
Regardez plutôt l’exemple suivant :
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php $prenom = 'Pierre'; $x = 4; $y = 5; function bonjour($p){ echo 'Bonjour ' .$p. '<br>'; } function addition($p1, $p2){ echo $p1. ' + ' .$p2. ' = ' .($p1 + $p2). '<br>'; } bonjour($prenom); bonjour('Mathilde'); addition($x, $y); addition(1, 1); ?> <p>Un paragraphe</p> </body> </html>
Ici, on crée deux fonctions : une première fonction bonjour()
qui va avoir besoin qu’on lui passe un argument pour fonctionner et une deuxième fonction addition()
dont le rôle va être d’additionner deux nombres et de renvoyer le résultat et qui va donc avoir besoin qu’on lui fournisse deux nombres pour fonctionner.
Notez qu’on est obligé d’utiliser des parenthèses ici pour calculer la somme de nos deux variables à cause de la priorité des opérateurs et des règles d’associativité.
En effet ici les opérateurs .
et +
ont la même priorité et l’associativité se fait par la gauche. Sans parenthèses, ce serait tout le bloc de gauche qui serait additionné à la valeur à droite du +
. Comme le bloc de gauche est une chaine de caractères, PHP va essayer de la convertir en nombre pour pouvoir l’additionner.
Ici, il faut savoir que PHP procède de la manière suivante pour la conversion : si la chaine de caractères commence par un nombre, alors c’est ce nombre qui sera utilisé. Dans le cas contraire, la valeur 0 sera utilisée.
Un point sur le cours jusqu’ici
Jusqu’à présent, nous avons parlé de variables, d’opérateur, de conditions, de boucles, de fonctions… Si vous êtes nouveau dans la programmation et n’avez jamais étudié d’autres langages qui s’exécutent côté serveur, il est fortement probable que vous soyez un peu perdu à ce niveau du cours.
Je vous rassure : cela est tout à fait normal. J’essaie d’expliquer un maximum et le plus simplement possible chaque nouvelle notion et de donner le plus d’exemples possibles concrets mais cela n’est pas toujours évident car la plupart des outils du PHP nécessitent de connaitre d’autres outils pour être utilisés intelligemment.
L’idée principale à retenir ici est que dans tous les cas personne n’apprend à coder en quelques jours car il ne suffit pas d’apprendre les différentes notions d’un langage mais il faut surtout comprendre comment elles fonctionnent indépendamment et entre elles.
Pas de panique donc : faites l’effort de vous concentrer à chaque leçon, de refaire tous les exemples que je vous propose et vous allez voir qu’au fur et à mesure qu’on avancera dans le cours vous allez comprendre de mieux en mieux les notions précédentes.
Pour cette raison, je vous conseille fortement de faire le cours dans son entièreté au moins deux fois : le deuxième passage vous permettra de voir chaque notion sous un nouveau jour puisque vous aurez déjà abordé les notions connexes lors de votre première lecture.
Par ailleurs, il est possible que vous ne compreniez pas bien l’intérêt des conditions, des boucles ou des fonctions pour le moment car on ne fait que passer des valeurs pour obtenir d’autres valeurs. C’est à nouveau tout à fait normal puisque pour le moment nous définissons nous-mêmes la valeur de nos variables, ce qui enlève tout l’intérêt de la plupart des exercices.
Cependant, vous devez bien comprendre et vous imaginer que nous allons par la suite travailler avec des variables dont nous ne connaissons pas les valeurs à priori (comme par exemple dans le cas où on récupère les données envoyées par nos utilisateurs via un formulaire). C’est à ce moment là où tout ce que nous avons vu jusqu’à présent va devenir vraiment intéressant.