define() vs const en PHP : guide détaillé avec exemples
\n\nTout développeur PHP se pose tôt ou tard la question : comment déclarer au mieux une constante — avec define() ou le mot-clé const ? À première vue, il n’y a presque aucune différence. Les deux options créent une valeur immuable. Mais le diable, comme toujours, se cache dans les détails.
Cet article n’est pas un extrait ennuyeux du manuel. Nous analyserons des cas réels où une approche l’emporte et l’autre échoue. Vous apprendrez à déclarer correctement les constantes en PHP 7 et PHP 8, et vous pourrez écrire un code plus propre et plus prévisible.
\n\nPrêt ? C’est parti !
\n\nQu’est-ce qu’une constante en PHP ?
\n\nAvant de comparer, rappelons les bases. Une constante est un identifiant (nom) pour une valeur simple. Sa principale propriété : la valeur ne peut pas être modifiée ou supprimée pendant l’exécution du script.
\n\nLes constantes sont pratiques pour stocker des configurations, des chemins de fichiers, des clés API et d’autres données statiques.
\n\n<?php\n// Définir une constante avec define()\ndefine('SITE_NAME', 'PythonLib');\n\n// Définir une constante avec const\nconst SITE_URL = 'https://pythonlib.ru';\n\necho SITE_NAME; // PythonLib\necho SITE_URL; // https://pythonlib.ru\n?>\n\nLes deux méthodes fonctionnent. Mais creusons un peu plus.
\n\nPrincipales différences entre define() et const
\n\n1. Moment de la définition
\n\nC’est le point le plus important. const est une construction linguistique traitée lors de la phase de compilation (avant l’exécution du script). define() est une fonction qui s’exécute à l’exécution (pendant l’exécution du script).
Qu’est-ce que cela signifie en pratique ?
\n\n- \n
constne peut être utilisé que pour déclarer des constantes au niveau supérieur du script ou à l’intérieur d’une classe. Vous ne pouvez pas placerconstà l’intérieur d’une bouclefor, d’une conditionifou d’une fonction. \n define()peut être appelé n’importe où : à l’intérieur d’une boucle, d’une condition, d’une fonction. Cela offre de la flexibilité. \n
<?php\n// Cela fonctionne\nif (true) {\n define('DB_HOST', 'localhost');\n}\n\n// Cela provoque une erreur fatale\nif (true) {\n // const DB_HOST = 'localhost'; // Erreur !\n}\n\n// Mais const peut être utilisé dans une classe\nclass Config {\n const DB_NAME = 'test';\n}\n?>\n\nConclusion : si vous devez définir une constante dynamiquement (par exemple, en fonction d’une condition ou à l’intérieur d’une fonction), choisissez define().
2. Types de données
\n\nEn PHP 7 et 8, define() prend en charge plus de types de données que const.
- \n
constne peut accepter que des valeurs scalaires (int, float, string, bool, null) et des tableaux (depuis PHP 5.6). \n define()depuis PHP 7 prend également en charge les tableaux, et en PHP 8, même les objets (mais c’est un cas rare). \n
<?php\n// const peut stocker un tableau (depuis PHP 5.6)\nconst FRUITS = ['apple', 'banana', 'cherry'];\n\n// define() peut aussi (depuis PHP 7)\ndefine('VEGETABLES', ['carrot', 'potato']);\n\n// Mais un objet — uniquement via define() (PHP 8+)\n// const OBJECT = new stdClass(); // Erreur !\ndefine('MY_OBJECT', new stdClass()); // Fonctionne\n?>\n\nConclusion : pour la plupart des tâches, les deux options conviennent. Mais si vous devez stocker un objet — seulement define().
3. Contexte : constantes globales vs constantes de classe
\n\nconst est un outil universel. Il peut être utilisé à la fois en dehors des classes (constantes globales) et à l’intérieur des classes (constantes de classe).
define() est uniquement pour les constantes globales. À l’intérieur d’une classe