Nous avons utilisé, dans les articles précédents, quelques fonctions de PHP : rand(), var_dump(), gettype(). Voyons à présent comment écrire nos propre fonctions en PHP.
Les fonctions on deux objectifs : le premier, la réutilisabilité du code – éviter d’écrire deux fois la même chose, le second objectif est de scinder un programme en plusieurs sous-programmes et par la même, de simplifier la lecture du code, et son débogage.
En PHP, une fonction se déclare toujours par le mot clé « function », suivit du nom de la fonction, d’une parenthèse ouvrante, des paramètres optionnels, puis d’une parenthèse fermante. Enfin, viennent les accolades pour définir le corps de la fonction.
Je vais une fois de plus reprendre l’exemple algorithmique de la partie Code <> / Général / Définition et algorithmie : « Je souhaites réaliser un programme qui me dit si je suis majeur ou mineur, et qui devra effectuer des actions précises dans les deux cas de figure. ».
Définissons cette fois-ci les actions par deux fonctions : « ActionMajeur() », et « ActionMineur() ». Déclarons-les ensemble :
Fichier functions.php :
<?php function ActionMineur() { } function ActionMajeur() { } ?>
Et c’est tout. Nos deux fonctions ont été définies, et ne comporte pour le moment aucun code. Ajoutons une phrase à afficher lorsque ces fonctions seront appelées.
Fichier functions.php v2 :
<?php function ActionMineur() { echo 'Vous êtes mineur!'; } function ActionMajeur() { echo 'Vous êtes majeur!'; } ?>
Voila ce que feront nos fonctions. Elles afficheront du texte spécifiant si on est mineur ou majeur. Ces deux fonctions ne sont pas exécutée automatiquement par PHP. Si on exécute le code actuel, on se retrouvera avec une page blanche.
Pour appeler une fonction, on utilise simplement son nom, suivit des parenthèses, et de ses paramètres s’il y en a. Ajoutons maintenant un peu de rand(), un petit embranchement conditionnel, et appelons nos fonctions.
Fichier functions.php v3 :
<?php function ActionMineur() { echo 'Vous êtes mineur!'; } function ActionMajeur() { echo 'Vous êtes majeur!'; } $age = rand(1, 30); echo 'Age choisi: ', $age, '<br>'; if($age >= 18) ActionMajeur(); else ActionMineur(); ?>
Plutôt pratique n’est-ce pas ? Mais nous pouvons encore faire mieux. Toute fonction peut renvoyer une valeur, quelle qu’elle soit, avec le mot clé « return ». Nous allons le mettre en pratique en créant une fonction DefinirAge().
Fichier functions.php v4 :
<?php function RecupererAge() { $valeur_a_retourner = rand(1, 30); return $valeur_a_retourner; } function ActionMineur() { echo 'Vous êtes mineur!'; } function ActionMajeur() { echo 'Vous êtes majeur!'; } $age = RecupererAge(); echo 'Age choisi: ', $age, '<br>'; if($age >= 18) ActionMajeur(); else ActionMineur(); ?>
Nous pouvons simplifier la fonction RecupererAge() comme ceci :
function RecupererAge() { return rand(1, 30); }
De cette manière, si on veut modifier la façon dont on récupère l’âge, il suffira de modifier la fonction « RecupererAge() ». On pourrait parfaitement imaginer que par la suite, nous chercherons l’âge depuis un formulaire ou encore une base de données. Cette méthode de simplifications à extrême n’est pas forcément toujours utile, mais cela vous donne une idée d’où je souhaite en venir.
Essayons maintenant de créer une fonction « Ajouter » qui prend deux paramètres, « A », et « B ». Nous retournerons le résultat de « A » + « B », puis nous l’afficherons. On tirera « A » et « B » aléatoirement.
Fichier functions2.php :
<?php $nombreA = RecupererNombreAleatoire(); $nombreB = RecupererNombreAleatoire(); echo $nombreA, ' + ', $nombreB, ' = ', Ajouter($nombreA, $nombreB); function RecupererNombreAleatoire() { return rand(5, 10); } function Ajouter($A, $B) { $Addition = $A + $B; return $Addition; } ?>
Ce qui nous intéresse ici est la fonction « Ajouter() », qui prend en compte 2 paramètres obligatoires « A » et « B ». Au début du fichier, nous avons défini deux variables, « nombreA » et « nombreB », et leur avons donné une valeur aléatoire via une fonction prévue à cet effet, comme nous avons pu le voir précédemment. J’ai ensuite utilisé la fonction « Ajouter() » avec mes deux nombres en paramètres. Ca tombe bien, la fonction « Ajouter() » demande deux paramètres. Ceux-ci ont été défini comme des variables (les paramètres sont toujours des variables), et ils ont été copié en mémoire avant l’appel de la fonction. C’est-à-dire que si maintenant, je décidais de modifier la valeur de « A » ou de « B » dans le corps de ma fonction « Ajouter() », eh bien « nombre1 » et « nombre2 » ne seront quant à eux, non modifié. Il est important de le préciser, car nous allons voir un peu plus loin comment on peut procéder si on souhaite modifier la valeur d’origine d’un paramètre.
Voyons maintenant comment procéder pour avoir des arguments facultatifs. Pour ce faire, il nous suffit simplement de déclarer une valeur par défaut au paramètre en question. Faisons-le en ajoutant un troisième argument, « C », qui sera optionnel, et vaudra 5 par défaut.
Fichier functions2.php v2 :
<?php $nombreA = RecupererNombreAleatoire(); $nombreB = RecupererNombreAleatoire(); $nombreC = RecupererNombreAleatoire(); echo $nombreA, ' + ', $nombreB, ' + 5 = ', Ajouter($nombreA, $nombreB); echo '<br>'; echo $nombreA, ' + ', $nombreB, ' + ', $nombreC, ' = ', Ajouter($nombreA, $nombreB, $nombreC); function RecupererNombreAleatoire() { return rand(5, 10); } function Ajouter($A, $B, $C = 5) { $Addition = $A + $B + $C; return $Addition; } ?>
Prenez le temps de bien comprendre ce qui a été fait. J’ai ajouté « C » à notre addition, qui par défaut prend la valeur « 5 ». Seulement, elle ne vaudra « 5 » que si on omet le paramètre lors de l’appel de la fonction « Ajouter() ». Si une valeur est spécifiée lors de l’appel de la fonction, alors le paramètre par défaut est écrasé par cette valeur. Testez ce code, et vous pourrez le constater par vous-même.
Les variables globales
Nous avons pu voir tout à l’heure que les variables « A » et « B » – et même « C » – de la fonction « Ajouter() » avait une portée limitée à la fonction. En aucun cas on ne peut accéder aux variables « nombreA », « nombreB », et « nombreC » de cette façon.
Cependant, nous pouvons accéder à une variable définie en dehors de toute fonction grâce au mot clé « global ». Voyons comment ça marche. Nous allons mettre une chaine de caractères dans une variable globale, l’afficher depuis une fonction, et appeler cette dite fonction.
Fichier functions3.php :
<?php $chaine = 'Du texte à afficher ...'; AfficherTexte(); function AfficherTexte() { global $chaine; echo $chaine; } ?>
Dans l’exemple ci-dessus, j’ai déclaré une variable « chaine » en dehors de toutes fonctions. Cette variable a automatiquement une portée globale par rapport au script. Pour la récupérer dans la fonction « AfficherTexte() », j’ai du déclarer la variable « chaine » précédé du mot clé « global ». J’ai ainsi pu afficher ma variable globale.
Prudence toutefois avec les variables globales, évitez-les au maximum, elles sont sources de bogues et de failles de sécurité.
La notion de référence
Outre les variable locales au fonctions, globales aux scripts, on peut aussi utiliser des références de variable. Une référence, c’est un peu comme l’adresse mémoire originelle d’une variable. Pour déclarer qu’une variable doit être passée en paramètre d’une fonction par une référence, il faut faire précéder le nom du paramètre par un « & ». Cela permet, dans le cas des tableaux par exemple, d’éviter de les copier en entier dans la mémoire, coûteux en performances. De manière générale, les références sont peu utilisées, cependant je vous conseille de vous en servir lorsque vous avez beaucoup de données à traiter par le biais d’une fonction. Attention toutefois à ne pas modifier le contenu de la variable, excepté intentionnellement. Le script suivant va vous montrer comment on fait, et ce que ça fait.
Fichier functions4.php :
<?php $Nombre = rand(1, 5); AfficherNombre($Nombre); NonModificationNombre($Nombre); AfficherNombre($Nombre); ModificationNombre($Nombre); AfficherNombre($Nombre); function ModificationNombre(&$Reference) { $Reference = rand(6, 10); } function NonModificationNombre($Valeur) { $Valeur = rand(6, 10); } function AfficherNombre($Valeur) { echo 'Mon nombre est ', $Valeur, '<br>'; } ?>
Une fonction avec un paramètre obligatoire, donné par copie de valeur, on a déjà vu ça tout à l’heure. C’est le fonctionnement de la fonction « AfficherNombre() » qui prend un unique paramètre obligatoire, pour afficher le nombre choisi au hasard au début du script. Notez que j’ai utiliser ) chaque fois la variable « Nombre » en paramètre. Seule la fonction « ModificationNombre() » est capable de modifier « Nombre », car le paramètre est passé par référence. La fonction « NonModificationNombre() » est incapable de modifier la valeur d’origine de la variable, car le paramètre est passé sans référence. Un autre avantage notable des références, c’est de pouvoir avoir plus d’une variable de réponse à une fonction. Ca peut être utile, donc notez vous dans la tête que ça existe, et mettez la page en favoris pour avoir le snippet.
Conclusion
Vous savez désormais comment on déclare une fonction et ce qu’on peut en faire. Vous savez créer une fonction avec ou sans paramètre, avec référence ou non, et à quoi ça sert. Je n’ai plus rien à dire sur le sujet. Dans le prochain chapitre, nous parlerons des bibliothèques de fonctions.