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.
Une fonction peut avoir un ou plusieurs paramètres.
<?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.
<?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.
<?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.
<?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.
<?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.
<?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[].
<?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.
<?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 .