Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

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 :

Encore des hobbits

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 :

12

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 :

Les paramètres du tableau sont :
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
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 cappuccino
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 à Bob un cappuccino et un croissant
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 :

Nombre de hobbits : 4

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 :

Nombre de parametres : 4
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 :

Nombre de parametres : 4
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 :

25

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 :

Sacquet est un hobbit

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 :

est un hobbit

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 :

Frodon est un hobbit

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 :

Frodon est un hobbit

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

AVERTISSEMENT

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.