define() vs const en PHP : le choc des titans pour déclarer des constantes
\n\nVous êtes-vous déjà demandé pourquoi PHP propose deux façons de déclarer une constante ? Pourquoi multiplier les possibilités ? Comme souvent, le diable se cache dans les détails. Cette question sur Stack Overflow cumule des milliers de vues, et pour cause : la différence entre define() et const peut profondément impacter l'architecture de votre code.
Aujourd'hui, nous allons enfin y voir clair. Vous découvrirez non seulement les différences syntaxiques, mais aussi quel outil offre un réel avantage selon le contexte. C'est parti !
\n\nPetit rappel : qu'est-ce qu'une constante en PHP ?
\n\nUne constante est un identifiant pour une valeur simple. Sa particularité : sa valeur ne peut pas être modifiée pendant l'exécution du script (contrairement à une variable). Par défaut, les constantes sont sensibles à la casse, mais cela peut être configuré (spoiler : avec define()).
Exemple de constante classique :
\n\n<?php\ndefine("MAX_UPLOAD_SIZE", 10485760); // 10 Mo en octets\necho MAX_UPLOAD_SIZE; // 10485760\n?>\n\nLa même chose avec const :
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>\n\nEn apparence, c'est identique. Mais creusons un peu.
\n\nLes principales différences entre define() et const
\n\nFaisons le point. Voici les différences essentielles que tout développeur PHP doit connaître.
\n\n1. Moment de déclaration : compilation vs exécution
\n\nC'est la différence la plus fondamentale.
\n\n- \n
const— est déclarée au moment de la compilation. Cela signifie que vous ne pouvez pas utiliserconstdans des boucles, des conditions ou des fonctions. Elle doit être déclarée dans le « corps » d'une classe (pour les constantes de classe) ou dans la portée globale. \n define()— est exécutée à l'exécution (runtime). Vous pouvez la placer n'importe où : dans unif,for,while, voire dans une fonction (bien que ce soit une mauvaise pratique). \n
Exemple qui ne fonctionnera pas avec const :
<?php\nif (PHP_OS === 'WINNT') {\n const PLATFORM = 'Windows';\n // Erreur fatale : Impossible d'utiliser const dans une structure de contrôle\n}\n?>\n\nAvec define(), aucun problème :
<?php\nif (PHP_OS === 'WINNT') {\n define('PLATFORM', 'Windows');\n echo PLATFORM; // Windows\n}\n?>\n\n2. Types de données : tableaux et objets
\n\nLongtemps, define() n'acceptait que les types scalaires (chaînes, nombres, booléens). Depuis PHP 7, define() gère également les tableaux.
const accepte aussi les tableaux (depuis PHP 5.6), mais ne supporte ni les objets ni les expressions :
<?php\n// Fonctionne avec PHP 7+\ndefine('FRUITS', ['pomme', 'banane', 'cerise']);\necho FRUITS[1]; // banane\n\n// Fonctionne aussi (PHP 5.6+)\nconst COLORS = ['rouge', 'vert', 'bleu'];\n\n// En revanche, ceci génère une erreur !\n// const RESULT = 2 + 3; // Fonctionne, c'est une expression constante\n// const DYNAMIC = rand(1, 10); // Erreur ! Ce n'est pas une expression constante\n?>\n\nImportant : define() peut utiliser le résultat de fonctions (define('SITE_NAME', get_site_name())), alors que const n'accepte que des expressions constantes (nombres, chaînes, autres constantes).
3. Espace de noms et portée
\n\nIl y a ici une nuance subtile mais importante.
\n\n- \n
define()— crée toujours une constante globale. Même si vous l'appelez dans un espace de noms, la constante sera accessible partout. \n const— respecte les règles des espaces de noms. Une constante déclarée dans le namespaceMyApp\\Configsera nomméeMyApp\\Con\n