Les fonctions
Dernière mise à jour le 8 octobre 2022
Définition d'une fonction
L'identificateur est précédé du mot réservé function
.
Une fonction n'a pas besoin d'être définie avant d'être utilisée, sauf dans le cas des fonctions conditionnelles (celles-ci sont rarement utilisées et ne seront pas abordées ici).
Exemple de fonction :
// appel de la fonction bonjour(); // définition de la fonction (avant ou après l'appel) function bonjour() { echo "Bonjour tout le monde!"; }
Passage de paramètres
Tout comme les variables ordinaires, les paramètres formels sont précédé du symbole $
:
function encadrer($texte, $bordure) { echo '<span style="border: solid black ' . $bordure . 'px;">'; echo $texte; echo '</span>'; } encadrer('Encore des hobbits', 3);
Sortie :
Le type de la valeur de retour n'a pas à être indiqué :
// ----------------------------------- // Retourne la somme de deux nombres // ----------------------------------- function additionner($a, $b) { <-- ici le type de retour n'est pas indiqué return $a + $b; } echo additionner(4, 8);
Sortie :
On peut toutefois le faire de la manière suivante :
// ----------------------------------- // Retourne la somme de deux nombres // ----------------------------------- function additionner($a, $b): int { return $a + $b; }
Il n'est donc pas toujours possible de déterminer si une fonction retourne quelque chose en examinant simplement son en-tête.
Un tableau en paramètre
Il est possible de passer un tableau en paramètre.
C'est même la façon qu'utilisait PHP3 pour passer à une fonction un nombre variable de paramètres.
Il s'agit toujours d'un passage par valeur (par copie) :
function afficher_tableau($tab) { echo "Les paramètres du tableau sont :<br>"; for ($i = 0; $i < sizeof($tab); $i++) { echo $tab[$i]."<br>"; } } $tableau = array("premier", "deuxième", "troisième"); afficher_tableau($tableau);
Sortie :
premier
deuxième
troisième
Passage de paramètres par référence
Par défaut, les paramètres sont passés à la fonction par valeur (copie).
Il est possible de passer des paramètres par référence en les faisant précéder du caractère &
(la perluette) dans l'en-tête de la fonction.
Exemple de passage par référence :
function ajouter_quelque_chose (&$texte) { $texte = $texte . ", avec quelque chose de plus."; } $chaine = "Ceci est une chaîne"; echo $chaine . "<br>"; ajouter_quelque_chose($chaine); echo $chaine;
Sortie :
Ceci est une chaîne, avec quelque chose de plus.
Valeur par défaut des paramètres
Il est possible de spécifier des valeurs par défaut aux paramètres :
function servir_cafe($cafe = "cappuccino") { return "Servir un $cafe <br>"; } echo servir_cafe(); // la valeur par défaut sera utilisée echo servir_cafe("espresso");
Sortie :
Servir un espresso
Il est même possible d'utiliser des tableaux ainsi que la constante NULL
comme valeur par défaut.
Attention : dans l'en-tête de la fonction, les paramètres avec valeur par défaut doivent être placés après les autres.
Exemple :
function servir_cafe($client, $cafe = "cappuccino", $patisserie = "croissant") { return "Servir à $client un $cafe et un $patisserie <br>"; } echo servir_cafe("Bob"); // cappuccino, croissant echo servir_cafe("Linda", "espresso"); // croissant echo servir_cafe("Linda", "espresso", "gros beigne");
Sortie :
Servir à Linda un espresso et un croissant
Servir à Linda un espresso et un gros beigne
Nombre variable de paramètres
PHP autorise les fonctions à nombre variable de paramètres.
Des fonctions particulières permettent de récupérer les paramètres.
La fonction func_num_args() retourne le nombre de paramètres passés à la fonction.
int func_num_args(void);
Exemple :
function afficher_hobbits() { // récupère le nombre de paramètres $nb = func_num_args(); echo "Nombre de hobbits : " . $nb; } afficher_hobbits("Frodon", "Sam", "Merry", "Pippin");
Sortie :
Attention : func_num_args() génère une alerte si elle est appelée à l'extérieur d'une fonction.
La fonction func_get_arg() retourne un élément de la liste des paramètres passés à une fonction.
mixed func_get_arg(int numéro_paramètre);
Les paramètres sont comptés en commençant par zéro.
func_get_arg() doit elle aussi être appelée à l'intérieur d'une fonction.
Si le numéro du paramètre est plus grand que le nombre de paramètres passés à la fonction, une alerte est générée et la fonction retourne FALSE
.
Exemple :
function afficher_hobbits() { // récupère le nombre de paramètres $nb = func_num_args(); echo "Nombre de parametres : $nb <br>"; // affiche le deuxième paramètre if ($nb >= 2) { echo "Le deuxieme hobbit est : " . func_get_arg(1) . "<br>"; } } afficher_hobbits("Frodon", "Sam", "Merry", "Pippin");
Sortie :
Le deuxieme hobbit est : Sam
La fonction func_get_args() retourne les paramètres d'une fonction sous forme de tableau.
array func_get_args(void);
func_get_args() doit elle aussi être appelée à l'intérieur d'une fonction.
Exemple :
function afficher_hobbits() { // récupère le nombre de paramètres $nb = func_num_args(); echo "Nombre de parametres : $nb <br>"; // récupère le tableau de paramètres $liste = func_get_args(); for ($i = 0; $i < $nb; $i++) { echo "Le parametre $i est : ". $liste[$i] . "<br>"; } } afficher_hobbits("Frodon", "Sam", "Merry", "Pippin");
Sortie :
Le parametre 0 est : Frodon
Le parametre 1 est : Sam
Le parametre 2 est : Merry
Le parametre 3 est : Pippin
En résumé nous avons :
La fonction | retourne... |
---|---|
func_num_args() | le nombre de paramètres |
func_get_arg(int) | le paramètre dont le numéro est fourni |
func_get_args() | un tableau contenant tous les paramètres de la fonction |
Valeur de retour
Le retour d'une valeur par une fonction est toujours optionnel.
Tous les types de variables peuvent être renvoyés, y compris des tableaux.
Le retour d'une valeur se fait par l'instruction return
.
Exemple :
// ---------------------------------------------- // Retourne le carre du nombre passé en paramètre // ---------------------------------------------- function carre($nombre) { return $nombre * $nombre; } echo carre(5);
Sortie :
Il est impossible de retourner plusieurs valeurs en même temps. L'astuce consiste à retourner un tableau.
Exemple :
function des_hobbits() { return array("Frodon", "Sam", "Merry", "Pippin"); } list($hob_0, $hob_1, $hob_2, $hob_3) = des_hobbits();
Remarque : list()
, qui tout comme array()
n'est pas une fonction mais une construction du langage, affecte une liste de variables à partir des éléments d'un tableau.
Ainsi la dernière ligne de l'exemple précédent peut être remplacée par :
$hobbits = des_hobbits(); $hob_0 = $hobbits[0]; $hob_1 = $hobbits[1]; $hob_2 = $hobbits[2]; $hob_3 = $hobbits[3];
Portée des variables
La portée d'une variable dépend du contexte dans laquelle elle est définie.
Si une variable est définie au niveau du script, sa portée s'étend à la totalité de ce dernier, sauf à l'intérieur des fonctions (différent des autres langages basés sur le C).
Si une variable est définie dans une fonction, sa portée est limitée à la fonction (variable locale).
Exemple 1 :
<?php $hobbit = "Frodon"; function est_un_hobbit() { $hobbit = "Sacquet"; echo $hobbit . " est un hobbit"; } // appel de la fonction est_un_hobbit(); ?>
Sortie :
Exemple 2 :
<?php
$hobbit = "Frodon";
function est_un_hobbit() {
$hobbit = "Sacquet";
echo $hobbit . " est un hobbit";
}
// appel de la fonction
est_un_hobbit();
// constitue une erreur car la variable $hobbit n'est pas définie
// dans la fonction
?>
Sortie :
Pour accéder à partir d'une fonction à une variable définie à l'extérieur de celle-ci, il faut utiliser le mot réservé global
.
Exemple :
<?php $hobbit = "Frodon"; function est_un_hobbit() { global $hobbit; // va chercher cette variable au niveau "global" echo $hobbit . " est un hobbit"; } // appel de la fonction est_un_hobbit(); ?>
Sortie :
Une autre façon consiste à utiliser le tableau associatif prédéfini $GLOBALS
.
Exemple :
<?php $hobbit = "Frodon"; function est_un_hobbit() { echo $GLOBALS["hobbit"] . " est un hobbit"; } // appel de la fonction est_un_hobbit(); ?>
Sortie :
Accéder à nos fonctions
Les instructions include
et require
incluent et exécutent le fichier passé en paramètre.
Cela permet d'utiliser une fonction existante sans avoir à la réécrire.
Exemple :
// dans le fichier "encadrer.php" function encadrer($texte, $bordure) { echo '<span style="border: solid black ' . $bordure . 'px;">'; echo $texte; echo '</span>'; }
// dans le fichier "test.php" include "encadrer.php"; encadrer('Encore des hobbits', 3);
L'instruction require
fonctionne de la même façon que include
, sauf dans leur façon de gérer les erreurs.
Elles produisent toutes les deux une alerte, mais require
génère une erreur fatale, tandis qu'avec include
le script continuera son exécution.
Il faut donc utiliser require
si on veut interrompe l'exécution d'un script si le fichier à inclure est introuvable.
Les fonctions include_once
et require_once
empêche qu'un même fichier ne soit inclus plusieurs fois.
À cause des vérifications qu'elles doivent effectuer, ces deux fonctions sont moins performantes que require
et include
.
Questions et exercices de révision
Nous ne fournirons pas les réponses à ces questions pour deux bonnes raisons. La première est que celles-ci se trouvent dans les notes de cours. La seconde est que, dans certains cas, ce serait presque donner la réponse à des questions d'examen.
Question 1
Donnez le code d'une fonction qui reçoit en paramètre un tableau de nombres entiers et qui retourne ce tableau avec chacun des nombres qu'il contient multiplié par deux.
Question 2
Modifiez la fonction de la question précédente pour qu'elle ne retourne rien, mais qu'elle modifie plutôt le tableau original.
Question 3
Écrivez le code de la fonction souhait() dont la sortie est la suivante :
souhait("Bonjour"); // Bonjour Bob souhait("Bonjour", "Linda"); // Bonjour Linda souhait("Bonsoir", "Linda"); // Bonsoir Linda souhait("Bonsoir"); // Bonsoir Bob souhait(); // erreur
Question 4
Écrivez une fonction à nombre variable de paramètres qui affiche le troisième paramètre reçu ou un message d'erreur s'il y a moins de trois paramètres.Question 5
Écrivez une fonction à nombre variable de paramètres qui affiche les paramètres reçus dans l'ordre inverse. Par exemple :
ma_fonction("foo", "bar", "baz"); // affiche baz bar foo
Question 6
Expliquez à quoi sert l'instruction list
.
Question 7
Vrai ou faux? Une variable créée au niveau du script (niveau "global") est accessible à l'intérieur des fonctions.
Question 8
Vrai ou faux? Une variable créée dans une fonction est accessible au niveau du script (niveau "global").
Question 9
Expliquez à quoi sert le mot clé global
.
Question 10
Expliquez à quoi sert la variable $GLOBALS
.
Question 11
Expliquez la différence entre include
et require
.
Question 12
Expliquez la différence entre include
et include_once
.
Question 13
Dans la documentation de PHP, on trouve des fonctions qui retournent un résultat de type mixed
. Expliquez ce que signifie ce drôle de type.