1.4Fonctions & portée des variables
Les fonctions sont des blocs de code RÉUTILISABLES qui accomplissent une tâche précise. Au lieu de répéter le même code à plusieurs endroits, on l'écrit UNE fois dans une fonction, qu'on APPELLE quand on en a besoin. On DÉFINIT une fonction avec le mot-clé function : function saluer($nom) { return 'Bonjour ' . $nom; }, et on l'APPELLE par son nom : saluer('Alice'). Les paramètres (ici $nom) sont les données qu'on passe à la fonction (ses « entrées ») ; la valeur de retour (via return) est le résultat qu'elle renvoie (sa « sortie »). Une fonction peut avoir plusieurs paramètres, des paramètres par défaut (function saluer($nom = 'inconnu') — utilise 'inconnu' si aucun nom n'est passé), et renvoyer une valeur (ou rien). Les fonctions sont un pilier de la programmation : elles évitent la duplication, rendent le code lisible (un nom de fonction explicite documente ce que fait le code), facilitent la maintenance (on corrige à un seul endroit) et le test.
Un concept crucial associé aux fonctions est la portée des variables (scope). En PHP, une variable définie DANS une fonction est locale : elle n'existe qu'à l'intérieur de la fonction, invisible à l'extérieur. Inversement, une variable définie à l'extérieur (globale) n'est PAS automatiquement accessible dans une fonction — contrairement à ce que des débutants attendent parfois. Cette isolation est VOULUE et BÉNÉFIQUE : elle évite que les fonctions interfèrent entre elles ou modifient par accident des variables externes (chaque fonction a son « espace » propre). Pour qu'une fonction utilise des données externes, on les lui passe en PARAMÈTRES (la bonne pratique) — pas via des variables globales. PHP moderne encourage aussi le typage : on peut déclarer le type des paramètres et du retour (function additionner(int $a, int $b): int { return $a + $b; }) — cela documente la fonction, attrape des erreurs (passer un mauvais type provoque une erreur claire) et rend le code plus robuste. C'est fortement recommandé en PHP moderne. Deux autres notions : les fonctions anonymes (closures) — des fonctions sans nom qu'on peut stocker dans une variable ou passer en argument (utiles pour les callbacks, par exemple avec les fonctions de tableau) —, et les fonctions fléchées (PHP 7.4+, syntaxe courte pour les closures simples). Enfin, PHP possède des CENTAINES de fonctions natives (intégrées) : pour les chaînes (strlen, str_replace…), les tableaux (count, array_map…), les dates, les maths, etc. — savoir qu'elles existent et consulter la documentation officielle est un réflexe (ne réinventez pas ce qui existe). Bien découper son code en fonctions (chacune avec une responsabilité claire, des paramètres explicites, idéalement typée) est une compétence fondamentale : c'est ce qui distingue un code organisé, réutilisable et maintenable d'un long script illisible.
Vocabulaire de la section
- Fonction
- Bloc de code réutilisable accomplissant une tâche : `function saluer($nom) { return ... }`, appelée par son nom. Évite la duplication, améliore lisibilité et maintenance.
- Paramètres / retour
- Paramètres : données passées en entrée (avec valeurs par défaut possibles). Retour (via `return`) : le résultat renvoyé. Les entrées et sorties de la fonction.
- Portée (scope)
- Une variable définie dans une fonction est LOCALE (invisible dehors) ; une variable externe n'est pas accessible dans la fonction. Isolation voulue — passer les données en PARAMÈTRES.
- Typage des paramètres/retour
- Déclarer les types (`function f(int $a): int`) documente, attrape des erreurs et rend le code robuste — fortement recommandé en PHP moderne.
- Closures / fonctions natives
- Fonctions anonymes (closures) et fléchées : sans nom, stockables/passables (callbacks). PHP a des centaines de fonctions natives (strlen, array_map…) — consulter la doc.
Pourquoi passer les données en PARAMÈTRES aux fonctions plutôt qu'utiliser des variables globales ?
En pratique — Écrire des fonctions réutilisables
- Définissez une fonction avec `function`, des paramètres et un `return` (ex. calculer un prix TTC à partir d'un prix HT).
- Ajoutez un paramètre par défaut et testez l'appel avec et sans ce paramètre.
- Constatez la portée : une variable définie dans la fonction n'existe pas dehors ; passez les données externes en PARAMÈTRES (pas via des globales).
- Ajoutez le typage des paramètres et du retour (`function f(int $a, int $b): int`) et découvrez quelques fonctions natives (strlen, count, array_map).
Points clés à retenir
- Les FONCTIONS sont des blocs réutilisables (`function nom($params) { return ... }`) : elles évitent la duplication, améliorent lisibilité, maintenance et test. PARAMÈTRES (entrées) + RETURN (sortie).
- PORTÉE (scope) : une variable définie dans une fonction est LOCALE (invisible dehors) ; les variables externes ne sont pas accessibles dedans (isolation voulue) — passer les données en PARAMÈTRES.
- PHP moderne : TYPER les paramètres et le retour (`function f(int $a): int`) documente, attrape des erreurs, rend robuste — fortement recommandé.
- Closures (fonctions anonymes) et fléchées pour les callbacks ; PHP a des CENTAINES de fonctions NATIVES (chaînes, tableaux, dates…) — consulter la doc, ne pas réinventer. Bien découper en fonctions = code organisé et maintenable.
Questions fréquentes
Pourquoi passer les données en paramètres plutôt que d'utiliser des variables globales dans les fonctions ?
C'est un principe de conception fondamental : passer les données en paramètres (plutôt que d'accéder à des variables globales depuis les fonctions) rend le code plus fiable, testable et maintenable — voici pourquoi, et pourquoi les globales sont à éviter. Le comportement de la portée en PHP : une variable définie DANS une fonction est locale (invisible dehors), et une variable définie DEHORS n'est PAS automatiquement accessible dans une fonction. C'est VOULU : chaque fonction a son espace isolé. Pour utiliser une variable externe dans une fonction, on POURRAIT la déclarer global (mot-clé qui donne accès à une variable globale) — mais c'est une MAUVAISE pratique dans la plupart des cas. Pourquoi les variables GLOBALES (accès via global) sont problématiques : (1) Couplage caché et dépendances invisibles. Une fonction qui accède à une variable globale a une DÉPENDANCE CACHÉE : rien dans sa signature (son nom et ses paramètres) n'indique qu'elle utilise cette variable externe. Pour comprendre ce dont la fonction a besoin, il faut lire tout son corps. Cela rend le code difficile à comprendre et à utiliser (« que faut-il pour appeler cette fonction ? »). (2) Effets de bord imprévisibles. Une fonction qui LIT ou MODIFIE des globales peut avoir des effets à distance (modifier une variable utilisée ailleurs), causant des bugs difficiles à traquer (« pourquoi cette variable a changé ? »). Les fonctions deviennent imprévisibles (leur comportement dépend d'un état externe caché). (3) Difficulté à TESTER. Une fonction qui dépend de globales est difficile à tester isolément : il faut mettre en place l'état global attendu, et les tests peuvent interférer entre eux (état partagé). Une fonction avec des paramètres explicites se teste facilement (on passe des valeurs, on vérifie le retour). (4) Réutilisation limitée. Une fonction couplée à des globales spécifiques est difficile à réutiliser ailleurs (elle attend un contexte global particulier). (5) Concurrence et état partagé. Les globales créent un état partagé, source de bugs et de complexité. Pourquoi passer les données en PARAMÈTRES est meilleur : (1) Interface EXPLICITE. Les paramètres DÉCLARENT ce dont la fonction a besoin. En voyant function calculerTVA($montant, $taux), on sait immédiatement ce qu'il faut lui fournir. La fonction est auto-documentée et facile à utiliser. (2) Prévisibilité (fonctions « pures »). Une fonction qui ne dépend QUE de ses paramètres (et ne modifie rien d'externe) est PRÉVISIBLE : pour les mêmes entrées, elle donne toujours le même résultat, sans effet de bord. C'est plus facile à comprendre, à raisonner, à déboguer. (3) Testabilité. On teste facilement (passer des entrées, vérifier la sortie), sans mise en place d'état global, sans interférence entre tests. (4) Réutilisation. Une fonction avec des paramètres explicites se réutilise dans n'importe quel contexte (on lui passe les bonnes données). (5) Découplage. La fonction ne dépend pas d'un état global, elle est autonome — plus modulaire, plus maintenable. Comment passer les données correctement : (1) Passez en PARAMÈTRES tout ce dont la fonction a besoin (les données à traiter, la configuration). (2) RETOURNEZ le résultat (via return) plutôt que de modifier des variables externes. Le flux est clair : entrées (paramètres) → traitement → sortie (retour). (3) Utilisez des paramètres par défaut pour les valeurs optionnelles. (4) Pour des données structurées, passez des tableaux ou des OBJETS (niveau 3) — un objet peut regrouper des données liées et leurs comportements (une meilleure façon d'organiser l'état que des globales). (5) Pour la configuration partagée (base de données, réglages), utilisez des approches propres (injection de dépendances, conteneurs de services — que vous verrez avec les frameworks) plutôt que des globales. Les rares cas où l'état « global » est légitime : certaines choses sont légitimement partagées (une connexion à la base, une configuration) — mais on les gère PROPREMENT (injection de dépendances, services, constantes pour les valeurs fixes), pas via des variables globales anarchiques. Les frameworks (niveau 4) fournissent des mécanismes structurés pour cela. En résumé : passez les données en PARAMÈTRES (et retournez les résultats) plutôt que d'accéder à des variables globales, car cela rend les fonctions explicites (interface claire), prévisibles (pas d'effet de bord caché), testables (isolées), réutilisables (autonomes) et maintenables (découplées). Les globales créent des dépendances cachées, des effets de bord imprévisibles, et compliquent tests et réutilisation — à éviter. La portée locale de PHP (isolation des fonctions) est une bonne chose : embrassez-la en passant les données explicitement. Ce principe (interfaces explicites, fonctions prévisibles, découplage) est fondamental en programmation et vous servira bien au-delà de PHP — c'est une marque de code propre et professionnel.
Faut-il typer les paramètres et retours en PHP, et qu'est-ce que cela apporte vraiment ?
Oui, typer vos paramètres et retours est fortement recommandé en PHP moderne — c'est une bonne pratique qui rend votre code plus robuste, lisible et sûr, avec un coût minime. Voyons ce que cela apporte concrètement. Rappel : PHP est à typage DYNAMIQUE (le type suit la valeur, pas de déclaration obligatoire). Mais PHP moderne permet de DÉCLARER les types (typage optionnel mais recommandé) : le type des paramètres (function f(int $a, string $b)) et le type de retour (: int après les parenthèses). On peut même activer le mode STRICT (declare(strict_types=1); en haut du fichier) pour un typage rigoureux. Ce que le typage apporte : (1) Détection d'ERREURS. Si vous appelez une fonction typée avec un mauvais type (passer une chaîne là où un entier est attendu), PHP lève une ERREUR CLAIRE (surtout en mode strict) — au lieu de laisser passer silencieusement une valeur qui causerait un bug plus loin, difficile à traquer. Le typage attrape ces erreurs TÔT, au point d'appel, avec un message précis. (2) DOCUMENTATION implicite. Les types DÉCRIVENT la fonction : function calculerTVA(float $montant, float $taux): float dit clairement « donne-moi un montant et un taux (des flottants), je te renvoie un flottant ». On comprend l'interface sans lire le corps. C'est une documentation vivante et fiable (contrairement aux commentaires qui se périment). (3) Meilleur OUTILLAGE (autocomplétion, analyse). Les éditeurs (VS Code, PhpStorm) et les outils d'analyse statique EXPLOITENT les types : autocomplétion précise (l'éditeur sait quel type est une variable, propose les bonnes méthodes), détection d'erreurs de type AVANT l'exécution (analyse statique), navigation, refactoring plus sûrs. Un vrai gain de productivité et de fiabilité au quotidien. (4) ROBUSTESSE. Le code typé est plus fiable : les erreurs de type (une source fréquente de bugs) sont attrapées, les fonctions reçoivent ce qu'elles attendent, le comportement est plus prévisible. (5) Clarté d'INTENTION. Typer exprime vos intentions (« cette fonction travaille avec des entiers ») et impose une discipline qui améliore la conception. (6) Facilite la MAINTENANCE et le travail en équipe. Sur un gros projet ou à plusieurs, les types clarifient les contrats entre les parties du code, préviennent les erreurs d'intégration, et documentent. Le bénéfice croît avec la taille du projet. Les types disponibles : types scalaires (int, float, string, bool), array, les classes/interfaces (typer par un type d'objet), void (retour sans valeur), les types NULLABLES (?int = int ou null), les types UNION (PHP 8 : int|string), mixed (n'importe quoi, à éviter si on peut préciser). PHP moderne offre un système de types riche. Le mode STRICT (declare(strict_types=1);) : sans lui, PHP tente de CONVERTIR les types (mode « coercitif » : passer '5' à un paramètre int le convertit en 5) — pratique mais moins rigoureux. Avec le mode strict, les types doivent correspondre EXACTEMENT (passer '5' à un int lève une erreur) — plus rigoureux et prévisible. La bonne pratique moderne est d'ACTIVER le mode strict (declare(strict_types=1); en haut de chaque fichier) pour un typage sûr, et de convertir explicitement quand nécessaire (contrôle). Le « coût » du typage : (1) un peu plus à écrire (les annotations de type) — minime. (2) Parfois, gérer les conversions explicitement (en mode strict) demande un peu de rigueur — mais c'est justement ce qui évite les bugs. Le coût est faible, les bénéfices importants. Recommandation : (1) TYPEZ vos paramètres et retours — c'est une bonne pratique du PHP moderne, adoptée par les projets et frameworks sérieux. (2) ACTIVEZ le mode strict (declare(strict_types=1);) pour un typage rigoureux. (3) Profitez des types riches (nullables, unions) pour exprimer précisément vos intentions. (4) Utilisez un éditeur qui exploite les types (autocomplétion, analyse) — vous en tirerez un bénéfice quotidien. (5) Considérez aussi les outils d'ANALYSE STATIQUE (comme PHPStan, Psalm) qui, en s'appuyant sur les types, détectent des bugs avant l'exécution — un atout majeur pour la qualité (à découvrir quand vous serez plus avancé). En résumé : oui, typez vos paramètres et retours (et activez le mode strict) — c'est fortement recommandé en PHP moderne. Cela apporte la détection d'erreurs de type (tôt, avec des messages clairs), une documentation implicite (les types décrivent l'interface), un meilleur outillage (autocomplétion, analyse statique), de la robustesse et de la clarté. Le coût est minime (quelques annotations), les bénéfices importants (moins de bugs, code plus lisible et maintenable). Le typage est l'un des grands apports du PHP moderne (7/8) qui l'ont fait passer d'un langage « laxiste » à un langage robuste. Adoptez-le dès vos premières fonctions : c'est une habitude qui améliore durablement la qualité de votre code et vous rapproche des standards professionnels.