Aller au contenu

Les fonctions

Les fonctions permettent d'organiser le code en unités réutilisables, améliorant ainsi la lisibilité et la maintenabilité.

Définition

Une fonction est déclarée avec le mot-clé function, suivie de son nom et de ses paramètres optionnels.

Fonction
<?php
function saluer() {
    echo 'Bonjour !';
}

Une fonction peut avoir un ou plusieurs paramètres.

Fonction
<?php
function saluer($nom, $prenom) {
    echo 'Bonjour '.$prenom.' '.strtoupper($nom).' !';
}

saluer('Leblanc', 'Juste'); // Affiche : Bonjour Juste LEBLANC !

Appel

Pour appeler une fonction, il suffit d'utiliser son nom suivi de parenthèses, et des paramètres éventuels.

Valeur de retour

Par défaut, une fonction retourne null. Le mot clé return permet de retourner un résultat.

return
<?php
function addition($a, $b) {
    return $a + $b;
}

$resultat = addition(10, 5);
echo "Résultat : $resultat"; // Affiche : Résultat : 15

Tous les types de valeur peuvent être retournés : valeurs scalaires, tableaux et objets.

Paramètres avec valeurs par défaut

On peut définir des valeurs par défaut pour éviter de les passer systématiquement.

Dans l'exemple suivant, si aucun paramètre n'est fourni, "Invité" est utilisé par défaut.

paramètre par défaut
<?php
function direBonjour($nom = 'Invité') {
    return "Bonjour, $nom !";
}

echo direBonjour(); // Bonjour, Invité !
echo direBonjour('Sophie'); // Bonjour, Sophie !

Paramètres typés (PHP 7+)

Depuis peu, PHP permet d'imposer le type des arguments et du retour.

Paramètres typés
<?php
function multiplier(int $a, int $b): int {
    return $a * $b;
}

echo multiplier(4, 3); // Affiche : 12
echo multiplier('a', 3); // Affiche : Fatal error: Uncaught TypeError: multiplier(): Argument #1 ($a) must be of type int, string given,
echo multiplier('4', 3); // Affiche : 12 -> '4' est converti en 4 avant exécution

Si vous voulez éviter cette conversion implicite et forcer une erreur lorsque l'argument n'est pas exactement du type attendu (int), utilisez declare(strict_types=1); en haut du fichier.

<?php
declare(strict_types=1);

function multiplier(int $a, int $b): int {
    return $a * $b;
}

echo multiplier(4, 3);    // 12
echo multiplier('4', 3);  // TypeError : Argument must be of type int, string given

Paramètres nommés (PHP 8)

A partir de PHP 8, les paramètres nommés permettent de passer les arguments en fonction du nom des paramètres et non de l'ordre dans lequel ils sont définis.

Paramètres nommés
<?php
function saluer($nom, $prenom, $age) {
    echo 'Bonjour '.$prenom.' '.strtoupper($nom).' ! ';
    echo 'Tu as '.$age.' ans';
}

saluer(age: 33, prenom : 'Juste', nom : 'Leblanc');

Portée des variables

La portée d'une variable correspond à l'ensemble des lignes de code où cette variable est accessible. La portée commence dès la déclaration de la variable. Si la déclaration est réalisée au sein d'une fonction, la portée de la variable est limitée au corps de cette fonction.

Local

Une variable locale est définie à l’intérieur d’une fonction et n’existe pas en dehors de cette fonction.

Portée de variables locales
<?php

function somme(){
    $a = 20;
    $b = 30;
    echo $a + $b;
}

echo 'La somme de '.$a. 'et de '.$b.' vaut '.somme();
Sans tester le code, à votre avis quelle est la somme affichée ?

Une erreur sera affichée (Warning: Undefined variable) car les variables $a et $b sont définies dans la fonction et ne sont donc pas accessibles en dehors.

Global

Une variable globale est définie hors d'une fonction et peut être utilisée à l’intérieur d’une fonction à l’aide du mot-clé global ou du tableau $GLOBALS[].

Portée de variables locales
<?php

<?php

$a = 20; // Déclaration en dehors de la fonction
$b = 30;

function somme(){
    global $a, $b; // Accès aux variables globales
    return $a + $b;
}

$resultat = somme();
echo "La somme de $a et de $b vaut $resultat";
Sans tester le code, à votre avis quelle est la somme affichée ?

Affiche : La somme de 20 et de 30 vaut 50.

Alternative : Utiliser $GLOBALS[] au lieu de global

<?php
<?php

$a = 20;
$b = 30;

function somme(){
    return $GLOBALS['a'] + $GLOBALS['b'];
}

$resultat = somme();
echo "La somme de $a et de $b vaut $resultat"; //   Affiche : La somme de 20 et de 30 vaut 50

⚠ Warning: Les variables globales rendent le code plus difficile à maintenir et peut être dangereux.

Variable statique

Une variable déclarée au sein d'une fonction comme statique, permet de conserver la valeur de la variable de manière unique d'un appel à l'autre de la fonction.

Variable statique
<?php

function compteur() {
    static $count = 0; // Conserve sa valeur entre appels
    $count++;
    echo "Appel numéro $count <br>";
}

for ($i=0; $i < 5 ; $i++) {
    compteur();
}
Sans tester le code, à votre avis quel sera l'affichage ?

Appel numéro 1 Appel numéro 2 Appel numéro 3 Appel numéro 4 Appel numéro 5

Testez en enlevant le mot clé static

Passage d'arguments par référence

Les arguments des fonctions sont, par défaut, passés par valeur. Cela signifie que lorsqu'une variable est passée à une fonction, une copie de sa valeur est créée et utilisée dans la fonction, sans modifier l'originale.

Cependant, on peut passer un paramètre par référence en ajoutant le symbole & devant le nom du paramètre dans la déclaration de la fonction. Cela signifie que la fonction modifie directement la variable originale.

Passage par valeur (comportement par défaut)

Par défaut, PHP transmet les arguments par valeur, c'est-à-dire qu'il fait une copie des données.

<?php
function doubler($x) {
    $x = $x * 2;
    echo "Valeur dans la fonction : $x\n";
}

$nombre = 5;
doubler($nombre);
echo "Valeur après appel de la fonction : $nombre\n";
Sans tester le code, à votre avis quel sera l'affichage ?

Valeur dans la fonction : 10 Valeur après appel de la fonction : 5

$nombre n'est pas modifié en dehors de la fonction car $x est une copie.

Passage par référence (avec &)

Pour modifier directement la variable originale, il faut passer l'argument par référence.

<?php
function doublerParReference(&$x) {
    $x = $x * 2;
    echo "Valeur dans la fonction : $x\n";
}

$nombre = 5;
doublerParReference($nombre);
echo "Valeur après appel de la fonction : $nombre\n";
Sans tester le code, à votre avis quel sera l'affichage ?

Valeur dans la fonction : 10 Valeur après appel de la fonction : 10

En utilisant &$x, $nombre est directement modifié dans la fonction et en dehors.

💡 Tip: Cette technique sera utilisée lorsque nous verrons les vérifications des formulaires .

Documenter une fonction

Exemple
<?php
/**
 *
 * La fonction réalise la mutliplication de deux nombres.
 *
 * @param float $a Premier  nombre à multiplier
 * @param float $b Second nombre à multiplier
 * @return float Produit  des 2 nombres
 */
function multiplier(float $a, float $b): float {
  return $a * $b;
}