define() vs const en PHP : lequel choisir et pourquoi c'est crucial

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

define() vs const en PHP : le choc des titans pour déclarer des constantes

\n\n

Vous ê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.

\n\n

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\n

Petit rappel : qu'est-ce qu'une constante en PHP ?

\n\n

Une 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()).

\n\n

Exemple de constante classique :

\n\n
<?php\ndefine("MAX_UPLOAD_SIZE", 10485760); // 10 Mo en octets\necho MAX_UPLOAD_SIZE; // 10485760\n?>
\n\n

La même chose avec const :

\n\n
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>
\n\n

En apparence, c'est identique. Mais creusons un peu.

\n\n

Les principales différences entre define() et const

\n\n

Faisons le point. Voici les différences essentielles que tout développeur PHP doit connaître.

\n\n

1. Moment de déclaration : compilation vs exécution

\n\n

C'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 utiliser const dans 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 un if, for, while, voire dans une fonction (bien que ce soit une mauvaise pratique).
  • \n
\n\n

Exemple qui ne fonctionnera pas avec const :

\n\n
<?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\n

Avec define(), aucun problème :

\n\n
<?php\nif (PHP_OS === 'WINNT') {\n    define('PLATFORM', 'Windows');\n    echo PLATFORM; // Windows\n}\n?>
\n\n

2. Types de données : tableaux et objets

\n\n

Longtemps, define() n'acceptait que les types scalaires (chaînes, nombres, booléens). Depuis PHP 7, define() gère également les tableaux.

\n\n

const accepte aussi les tableaux (depuis PHP 5.6), mais ne supporte ni les objets ni les expressions :

\n\n
<?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\n

Important : 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).

\n\n

3. Espace de noms et portée

\n\n

Il 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 namespace MyApp\\Config sera nommée MyApp\\Con
  • \n

Blogs

Book Recommendations