Les Fonctions en PHP

Apprenez à créer et utiliser des fonctions pour organiser votre code et le rendre plus modulaire, réutilisable et maintenable

Introduction aux fonctions

Les fonctions sont des blocs de code réutilisables qui permettent d'organiser et de structurer votre code. Elles constituent un élément fondamental de la programmation modulaire et sont essentielles pour créer des applications PHP bien conçues.

Une fonction en PHP peut être définie comme un ensemble d'instructions regroupées sous un nom unique, pouvant accepter des données (paramètres), traiter ces données et renvoyer un résultat.

Avantages des fonctions :
  • Réutilisabilité du code : Écrivez une fois, utilisez partout dans votre application
  • Meilleure organisation : Structurez votre code en blocs logiques et cohérents
  • Lisibilité améliorée : Des noms de fonctions bien choisis expliquent ce que fait le code
  • Maintenance simplifiée : Modifiez le comportement d'une fonctionnalité à un seul endroit
  • Facilité de débogage : Isolez et testez des portions spécifiques de code
  • Encapsulation : Masquez la complexité du code derrière des interfaces simples
  • Réduction de la duplication : Évitez de répéter le même code à plusieurs endroits
À retenir : En PHP, les fonctions doivent être définies avant d'être appelées, sauf si elles sont définies dans un fichier inclus ou dans une classe.

Fonctions de base

Une fonction se compose généralement d'un nom, de paramètres (facultatifs) et d'un corps contenant les instructions à exécuter. En PHP, les noms de fonctions ne sont pas sensibles à la casse, mais il est recommandé de les utiliser de manière cohérente.

Déclaration d'une fonction
function nomDeLaFonction($parametre1, $parametre2) {
    // Instructions à exécuter
    $resultat = /* traitement des paramètres */;
    return $resultat;
}

Les éléments de base d'une fonction :

  • Mot-clé function pour déclarer une fonction
  • Nom de la fonction (doit commencer par une lettre ou un underscore)
  • Paramètres entre parenthèses (séparés par des virgules)
  • Corps de la fonction entre accolades
  • Instruction de retour (facultative) avec return
Fonction avec retour
function addition($a, $b) {
    $resultat = $a + $b;
    return $resultat;
}

Appel de la fonction :

$somme = addition(5, 10);
echo "Le résultat est : " . $somme;

Résultat : 15

Avantage : Les fonctions avec retour permettent de traiter le résultat (le stocker dans une variable, le combiner avec d'autres valeurs, etc.) avant de l'afficher.
Fonction avec plusieurs instructions
function calculerSurfaceRectangle($longueur, $largeur) {
    // Vérification des valeurs
    if ($longueur <= 0 || $largeur <= 0) {
        return "Dimensions invalides";
    }
    
    // Calcul de la surface
    $surface = $longueur * $largeur;
    
    // Retourne le résultat
    return $surface;
}

Appel de la fonction :

echo calculerSurfaceRectangle(5, 3);

Résultat : 15

Fonction sans retour (affichage direct)
function afficherMessage($prenom) {
    echo "

Bonjour $prenom et bienvenue sur mon site!

"
; }

Appel de la fonction :

afficherMessage("Marie");

Bonjour Marie et bienvenue sur mon site!

Remarque : Les fonctions qui utilisent echo directement sont utiles pour l'affichage, mais moins flexibles que celles qui retournent une valeur. Il est souvent préférable de retourner une valeur plutôt que de l'afficher directement.

Paramètres de fonctions

Les fonctions PHP offrent différentes façons de gérer les paramètres pour plus de flexibilité. La manière dont vous définissez et utilisez les paramètres peut grandement influencer la réutilisabilité et la robustesse de vos fonctions.

Paramètres obligatoires et optionnels
function saluer($nom, $formule = "Bonjour") {
    return "$formule $nom !";
}

Appels de la fonction :

echo saluer("Jean");

Résultat : Bonjour Jean !

echo saluer("Marie", "Bonsoir");

Résultat : Bonsoir Marie !

Points importants :
  • Les paramètres obligatoires viennent d'abord, suivis des paramètres optionnels
  • Les paramètres optionnels ont une valeur par défaut assignée
  • Vous pouvez définir plusieurs paramètres optionnels
Nombre variable d'arguments (PHP 5.6+)
function somme(...$nombres) {
    return array_sum($nombres);
}

Appels de la fonction :

echo somme(1, 2, 3);

Résultat : 6

echo somme(10, 20, 30, 40);

Résultat : 100

Comment ça marche : L'opérateur ... (spread) collecte tous les arguments passés à la fonction dans un tableau. Vous pouvez aussi combiner des paramètres normaux avec des arguments variables :
function calculerTotal($taxe, ...$prix) {
    $somme = array_sum($prix);
    return $somme * (1 + $taxe/100);
}
Passage par référence
function incrementer(&$valeur, $increment = 1) {
    $valeur += $increment;
}

Appel de la fonction :

$nombre = 5; incrementer($nombre); echo $nombre;

Résultat : 6

La variable $nombre a été modifiée directement par la fonction, sans utiliser de valeur de retour.

Typage des paramètres (PHP 7+)
function calculerAire(float $longueur, float $largeur): float {
    return $longueur * $largeur;
}

Appel de la fonction :

echo calculerAire(3.5, 2);

Résultat : 7

Types disponibles : int, float, string, bool, array, object, callable, iterable (PHP 7.1+), mixed (PHP 8+), noms de classes et interfaces
Attention au passage par référence !
  • Modifie directement la variable originale, ce qui peut causer des effets secondaires inattendus
  • Utilisation recommandée : quand vous devez modifier plusieurs valeurs et qu'un retour multiple n'est pas pratique
  • Documentez toujours clairement le comportement de ces fonctions
  • En PHP moderne, préférez parfois retourner une nouvelle valeur plutôt que de modifier par référence

Types de fonctions avancés

Fonctions récursives
function factorielle($n) {
    // Cas de base
    if ($n <= 1) return 1;
    
    // Appel récursif
    return $n * factorielle($n - 1);
}

Appel de la fonction :

echo "5! = " . factorielle(5);

Résultat : 5! = 120

Concepts clés de la récursion :
  • Cas de base : Condition qui arrête la récursion (pour éviter une boucle infinie)
  • Appel récursif : La fonction s'appelle elle-même avec un état modifié
  • Décomposition du problème : Résoudre un problème en le réduisant à des sous-problèmes plus simples

Exemple visuel de factorielle(5):

factorielle(5)
└── 5 * factorielle(4) = 5 * 24 = 120
    └── 4 * factorielle(3) = 4 * 6 = 24
        └── 3 * factorielle(2) = 3 * 2 = 6
            └── 2 * factorielle(1) = 2 * 1 = 2
                └── factorielle(1) = 1 (cas de base)
                        
Attention à la profondeur de récursion ! PHP limite le nombre d'appels de fonction imbriqués. Utilisez des approches itératives pour les calculs avec de grandes valeurs.
Fonctions anonymes
$calculerCarre = function($nombre) {
    return $nombre * $nombre;
};

// Utilisation comme fonction de tri
$fruits = ['pomme', 'banane', 'fraise'];
usort($fruits, function($a, $b) {
    return strlen($a) - strlen($b); // Trie par longueur
});

Appel de la fonction :

echo $calculerCarre(4);

Résultat : 16

Exemple avec usort :

$fruits = ['pomme', 'banane', 'kiwi', 'fraise']; usort($fruits, function($a, $b) { return strlen($a) - strlen($b); }); print_r($fruits);
Array
(
    [0] => kiwi
    [1] => pomme
    [2] => banane
    [3] => fraise
)
Caractéristiques des fonctions anonymes :
  • Peuvent être assignées à des variables
  • Idéales comme callbacks pour d'autres fonctions
  • Peuvent "capturer" des variables externes avec le mot-clé use
  • Particulièrement utiles pour le tri et le filtrage
Fonctions fléchées (PHP 7.4+)
// Syntaxe des fonctions fléchées
$multiplier = fn($a, $b) => $a * $b;

// Les variables extérieures sont capturées automatiquement
$prix = 100;
$calculerTVA = fn($taux = 20) => $prix * $taux / 100;

// Dans un tableau avec array_map
$nombres = [1, 2, 3, 4, 5];
$doubles = array_map(fn($n) => $n * 2, $nombres);

Appel simple :

echo $multiplier(3, 4);

Résultat : 12

Avec capture de variable :

$prix = 100; $calculerTVA = fn($taux = 20) => $prix * $taux / 100; echo "TVA : " . $calculerTVA() . " €";

Résultat : TVA : 20 €

Utilisation avec array_map :

$nombres = [1, 2, 3, 4, 5]; $doubles = array_map(fn($n) => $n * 2, $nombres); echo implode(", ", $doubles);

Résultat : 2, 4, 6, 8, 10

Avantages des fonctions fléchées :
  • Syntaxe concise pour les opérations simples
  • Capture automatique des variables extérieures
  • Idéales pour les callbacks courts
  • Un seul énoncé, retour implicite (pas besoin de return)
  • Très expressives avec les fonctions de manipulation de tableaux
Callable et Closures
function executerOperation(callable $operation, $a, $b) {
    return $operation($a, $b);
}

// Différentes façons d'appeler cette fonction
function additionner($x, $y) {
    return $x + $y;
}

// 1. Avec le nom d'une fonction
$resultat1 = executerOperation('additionner', 5, 3);

// 2. Avec une fonction anonyme
$resultat2 = executerOperation(function($x, $y) {
    return $x * $y;
}, 5, 3);

// 3. Avec une méthode d'objet
$calculateur = new Calculateur();
$resultat3 = executerOperation([$calculateur, 'soustraire'], 5, 3);

Le type callable permet d'accepter différentes formes de fonctions comme paramètre, ce qui rend votre code extrêmement flexible. C'est la base de nombreux design patterns en PHP.

Portée des variables

La portée (scope) d'une variable détermine où celle-ci est accessible dans votre code. Comprendre ce concept est essentiel pour éviter les conflits de noms et les bugs liés aux variables.

Variables locales
function maFonction() {
    $variableLocale = "Je suis locale";
    echo $variableLocale;  // Fonctionne
}

maFonction();
echo $variableLocale;  // Erreur ! $variableLocale n'existe pas ici

Explication :

La variable $variableLocale est créée à l'intérieur de la fonction et n'existe que pendant son exécution. Elle est détruite une fois la fonction terminée.

Point clé : Les variables locales :
  • Sont créées à chaque appel de fonction
  • Ne sont pas accessibles en dehors de la fonction
  • Sont détruites à la fin de l'exécution de la fonction
  • Permettent d'éviter les conflits de noms entre fonctions
Variables globales
$variableGlobale = "Je suis globale";

function accederGlobale() {
    global $variableGlobale; // Déclaration d'accès à la variable globale
    echo $variableGlobale;
}

function modifierGlobale() {
    global $variableGlobale;
    $variableGlobale = "Valeur modifiée";
}

// Alternative avec le tableau $GLOBALS
function autreMethode() {
    $GLOBALS['variableGlobale'] = "Nouvelle valeur";
}

Exemple d'utilisation :

$variableGlobale = "Valeur initiale"; echo "Avant : $variableGlobale
"; modifierGlobale(); echo "Après : $variableGlobale";

Résultat : Avant : Valeur initiale
Après : Valeur modifiée

Attention ! L'utilisation excessive de variables globales est généralement considérée comme une mauvaise pratique car :
  • Elle rend le code difficile à suivre et à maintenir
  • Elle peut causer des effets secondaires imprévisibles
  • Elle complique les tests unitaires
  • Elle crée des dépendances cachées
Préférez passer des paramètres et retourner des résultats.
Variables statiques
function compteur() {
    static $compte = 0; // Initialisée une seule fois
    $compte++; // Incrémentée à chaque appel
    return $compte;
}
wamp
// Exemple de cas pratique : mise en cache
function getDatabase() {
    static $connexion = null;
    
    if ($connexion === null) {
        // Connexion coûteuse, n'est faite qu'une seule fois
        $connexion = "Connexion établie"; // Dans la réalité: new PDO(...)
        echo "

Nouvelle connexion

"
; } else { echo "

Réutilisation de la connexion existante

"
; } return $connexion; }

Appels successifs de compteur() :

echo compteur() . ", " . compteur() . ", " . compteur();

Résultats : 1, 2, 3

Démonstration avec getDatabase() :

$db1 = getDatabase(); $db2 = getDatabase(); $db3 = getDatabase();

Nouvelle connexion

Réutilisation de la connexion existante

Réutilisation de la connexion existante

Utilisations courantes des variables statiques :
  • Compteurs et accumulateurs
  • Mise en cache de résultats coûteux à calculer
  • Implémentation du pattern Singleton
  • Mémorisation d'un état entre les appels de fonctions
  • Optimisation des performances

Bonnes pratiques

Conception des fonctions

  • Nommez clairement vos fonctions : Utilisez des noms descriptifs en format camelCase (ex: calculerTotalTTC()).
  • Une fonction, une tâche : Chaque fonction devrait idéalement accomplir une seule tâche bien définie.
  • Taille limitée : Les fonctions ne devraient pas dépasser 20-30 lignes. Si c'est le cas, envisagez de les diviser.
  • Limitez le nombre de paramètres : Idéalement entre 0 et 4. Au-delà, utilisez des tableaux associatifs ou des objets.

Documentation et lisibilité

  • Documentez vos fonctions : Utilisez le format PHPDoc pour documenter vos fonctions :
/**
 * Calcule le prix total TTC d'un produit
 *
 * @param float $prixHT Prix hors taxes
 * @param float $tauxTVA Taux de TVA (ex: 20 pour 20%)
 * @return float Prix TTC
 */
function calculerPrixTTC($prixHT, $tauxTVA = 20) {
    return $prixHT * (1 + $tauxTVA / 100);
}

Gestion des erreurs

  • Validez les arguments : Vérifiez toujours les entrées pour éviter les comportements inattendus.
  • Gérez les erreurs explicitement : Retournez des valeurs d'erreur claires ou utilisez des exceptions.
  • Évitez les effets de bord : Ne modifiez pas les variables globales ou les paramètres sauf si c'est explicitement attendu.

Conception orientée retour

  • Préférez return à echo : Les fonctions devraient retourner des valeurs plutôt que les afficher.
  • Cohérence dans les retours : Une fonction devrait retourner des valeurs de types similaires dans tous les cas.
  • Utilisez le typage de retour : En PHP 7+, spécifiez le type de retour pour une meilleure lisibilité et fiabilité.

Optimisation

  • Évitez la récursion profonde : PHP a des limites strictes sur la profondeur de récursion.
  • Utilisez des variables statiques pour mettre en cache des résultats coûteux à calculer.
  • Préférez les bibliothèques natives : Les fonctions PHP natives sont généralement plus rapides que le code personnalisé.
Avant vs Après : Refactorisation d'une fonction

❌ Avant

function f($a, $b, $c, $d) {
    if($a == "add") {
        $r = $b + $c;
        echo "Result: " . $r;
        return true;
    } else if($a == "subtract") {
        $r = $b - $c;
        echo "Result: " . $r;
        return true;
    } else if($a == "multiply") {
        $r = $b * $c;
        echo "Result: " . $r;
        return true;
    } else {
        echo "Unknown operation";
        return false;
    }
}

✅ Après

/**
 * Effectue une opération mathématique de base
 *
 * @param string $operation Type d'opération ('add', 'subtract', 'multiply')
 * @param float $nombre1 Premier nombre
 * @param float $nombre2 Second nombre
 * @return float|null Résultat ou null si opération invalide
 */
function calculer(string $operation, float $nombre1, float $nombre2): ?float {
    switch ($operation) {
        case 'add':
            return $nombre1 + $nombre2;
        case 'subtract':
            return $nombre1 - $nombre2;
        case 'multiply':
            return $nombre1 * $nombre2;
        default:
            return null;
    }
}

Exercices pratiques

Pour maîtriser les fonctions PHP, rien de tel que la pratique ! Voici une série d'exercices de difficulté progressive pour consolider vos connaissances.

Exercice 1 : Opération basique

Créez une fonction qui calcule le produit de deux nombres

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

// Test de la fonction
echo "4 × 5 = " . multiplier(4, 5); // Affiche 20
Exercice 2 : Traitement d'un tableau

Créez une fonction qui calcule la somme des éléments d'un tableau

function sommeTableau(array $tableau): float {
    $somme = 0;
    foreach ($tableau as $valeur) {
        $somme += $valeur;
    }
    return $somme;
}

Test :

echo sommeTableau([1, 2, 3, 4, 5]);

Résultat : 15

Astuce : Pour cet exercice, vous pouvez également utiliser la fonction native array_sum() comme solution alternative.
Exercice 3 : Manipulation de chaînes

Créez une fonction qui compte les voyelles dans une chaîne

function compterVoyelles(string $chaine): int {
    $voyelles = ['a', 'e', 'i', 'o', 'u', 'y', 
                'A', 'E', 'I', 'O', 'U', 'Y'];
    $compteur = 0;
    
    for ($i = 0; $i < strlen($chaine); $i++) {
        if (in_array($chaine[$i], $voyelles)) {
            $compteur++;
        }
    }
    
    return $compteur;
}

Test :

echo "Le mot 'Bonjour' contient " . compterVoyelles("Bonjour") . " voyelles.";

Résultat : Le mot 'Bonjour' contient 3 voyelles.

Exercice 4 : Fonction avancée

Créez une fonction qui filtre les éléments d'un tableau selon un critère

function filtrerTableau(array $tableau, callable $critere): array {
    $resultat = [];
    
    foreach ($tableau as $cle => $valeur) {
        if ($critere($valeur)) {
            $resultat[$cle] = $valeur;
        }
    }
    
    return $resultat;
}

Test avec une fonction anonyme pour filtrer les nombres pairs :

$nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; $pairs = filtrerTableau($nombres, function($n) { return $n % 2 == 0; }); echo "Nombres pairs : " . implode(", ", $pairs);

Résultat : Nombres pairs : 2, 4, 6, 8, 10

Exercice 5 : Défi récursif

Créez une fonction récursive qui calcule les nombres de la suite de Fibonacci

function fibonacci(int $n): int {
    // Cas de base
    if ($n <= 1) {
        return $n;
    }
    
    // Appel récursif
    return fibonacci($n - 1) + fibonacci($n - 2);
}

Suite de Fibonacci pour les 10 premiers termes :

for ($i = 0; $i < 10; $i++) { echo fibonacci($i) . " " ; }

Résultat : 0 1 1 2 3 5 8 13 21 34

Optimisation : Cette implémentation récursive est simple mais inefficace pour de grandes valeurs de n. Une approche itérative serait plus performante.

Défi supplémentaire

Créez une fonction memoize() qui prend une fonction en entrée et retourne une version optimisée qui met en cache les résultats pour éviter les calculs répétitifs. Utilisez-la pour optimiser la fonction fibonacci.

Ressources d'apprentissage

Documentation officielle PHP

Guide complet sur les fonctions en PHP avec des exemples détaillés

Référence
W3Schools - Les Fonctions PHP

Tutoriels simples et pratiques pour débutants

Débutant
OpenClassrooms - Fonctions PHP

Cours interactif en français pour apprendre à écrire des fonctions efficaces

Cours complet
PHP: The Right Way

Bonnes pratiques et conseils avancés sur l'utilisation des fonctions

Bonnes pratiques
Closure Performance

Article détaillé sur les performances des fonctions anonymes et closures en PHP

Avancé
PSR-12: Extended Coding Style

Standards de codage recommandés pour les déclarations de fonctions en PHP

Standards

Points à retenir

  • Les fonctions permettent d'organiser le code en blocs réutilisables
  • PHP offre plusieurs types de paramètres : obligatoires, facultatifs, variables, par référence
  • Les fonctions récursives s'appellent elles-mêmes pour résoudre des problèmes complexes
  • Les fonctions anonymes et fléchées sont idéales comme callbacks
  • Pensez à la portée des variables (locale, globale, statique) lors de la conception
  • Documentez vos fonctions avec PHPDoc pour améliorer la maintenabilité