const
Découvrez le mot-clé const en PHP pour déclarer des constantes globales et de classe, et ses différences avec define().
Le mot-clé const en PHP
Une constante est une valeur nommée qui ne peut pas changer pendant l'exécution d'un script. Le mot-clé const est l'une des deux façons dont PHP vous permet de déclarer une constante (l'autre est la fonction define()). Contrairement à une variable, une constante n'a pas de $ au début, et une fois définie, vous ne pouvez ni la réassigner ni utiliser unset() dessus.
Ce guide explique ce que fait const, en quoi il diffère de define(), où vous êtes autorisé à l'utiliser et les pièges courants à éviter.
Syntaxe
Vous pouvez utiliser const au niveau supérieur d'un script (une constante globale) ou à l'intérieur d'une classe, d'une interface ou d'un trait (une constante de classe) :
const NAME = value; // global constantclass ClassName {
const NAME = value; // class constant, accessed as ClassName::NAME
}Par convention, les noms de constantes sont écrits en UPPER_SNAKE_CASE. Un nom doit commencer par une lettre ou un underscore et ne contenir que des lettres, des chiffres et des underscores.
const vs define()
PHP vous offre deux outils qui se ressemblent mais se comportent différemment. Connaître les compromis permet d'économiser du temps de débogage :
| Fonctionnalité | const | define() |
|---|---|---|
| Évaluée | Au moment de la compilation | Au moment de l'exécution |
Peut s'exécuter conditionnellement (dans un if) | Non | Oui |
| Fonctionne à l'intérieur d'une classe | Oui (constante de classe) | Non |
| Nom depuis une variable/expression | Non | Oui (define($name, ...)) |
| Valeur | Expressions constantes uniquement | N'importe quelle expression |
Règle générale : utilisez const pour des valeurs fixes toujours définies (en particulier les constantes de classe), et define() lorsque le nom ou la valeur est décidé pendant l'exécution du programme.
<?php
// define() can be conditional; const cannot.
if (!defined('ENVIRONMENT')) {
define('ENVIRONMENT', 'production');
}
// This would be a fatal parse error — const cannot live inside an if-block:
// if (true) { const FOO = 1; }Consultez le chapitre dédié à define() et l'aperçu des constantes PHP pour en savoir plus.
Exemples
Constante de classe et constante globale
<?php
// Example 1 — a class constant referenced with self::
class Circle
{
const PI = 3.14;
public $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
public function getArea()
{
return self::PI * $this->radius * $this->radius;
}
}
$myCircle = new Circle(5);
echo "Area of circle: " . $myCircle->getArea() . PHP_EOL;
// Output: Area of circle: 78.5
// Example 2 — a global constant
const MY_NAME = "John";
echo "My name is " . MY_NAME;
// Output: My name is JohnVous lisez une constante de classe avec l'opérateur :: (résolution de portée) — self::PI depuis l'intérieur de la classe, Circle::PI depuis l'extérieur. Une constante globale s'utilise par son nom sans $. Pour en savoir plus sur les classes, consultez les classes et objets PHP et le chapitre sur les constantes de classe.
Expressions constantes et tableaux
Une valeur const doit être une expression constante — quelque chose que PHP peut évaluer sans exécuter de code. Vous pouvez utiliser des littéraux, des opérateurs et d'autres constantes déjà définies, et (depuis PHP 5.6) le résultat peut être un array.
<?php
const SECONDS_PER_MINUTE = 60;
const SECONDS_PER_HOUR = SECONDS_PER_MINUTE * 60; // built from another const
const ALLOWED_ROLES = ['admin', 'editor', 'viewer'];
echo SECONDS_PER_HOUR . PHP_EOL; // 3600
echo ALLOWED_ROLES[1] . PHP_EOL; // editorLes appels de fonctions et les instances d'objets ne sont pas autorisés dans une valeur const car ils ne peuvent pas être résolus au moment de la compilation.
Constantes de classe : visibilité, interfaces et final
Les constantes de classe appartiennent à la classe, pas à un objet particulier, vous n'avez donc pas besoin d'une instance pour les lire. Depuis PHP 7.1, vous pouvez également leur attribuer un modificateur de visibilité :
<?php
interface HasStatus
{
// Interface constants are always public.
const DEFAULT_STATUS = 'pending';
}
class Order implements HasStatus
{
public const TAX_RATE = 0.2; // readable everywhere
protected const MAX_QTY = 99; // this class + subclasses
private const SECRET = 'x'; // this class only
public function status(): string
{
return self::DEFAULT_STATUS; // inherited from the interface
}
}
echo Order::TAX_RATE . PHP_EOL; // 0.2
echo (new Order())->status() . PHP_EOL; // pendingLes interfaces peuvent aussi déclarer des constantes (toujours publiques) — voir les interfaces PHP. Une constante de classe peut être marquée final (PHP 8.1+) pour empêcher les sous-classes de la remplacer.
Pièges courants
- Pas de
$sur une constante.echo MY_NAME;fonctionne ;echo $MY_NAME;recherche une variable et échoue. - Ne peut pas être modifiée ou supprimée. Réassigner une constante est une erreur fatale ;
unset()ne fonctionne pas sur les constantes. - Compilation uniquement. Vous ne pouvez pas envelopper
constdans unif, une boucle ou une fonction basée sur des données d'exécution — utilisezdefine()pour cela. - Les constantes sont globales en portée. Une
constglobale est visible à l'intérieur des fonctions sansglobal, contrairement à une variable normale.
Avantages
- Lisibilité : une constante nommée comme
TAX_RATEdocumente l'intention bien mieux qu'un nombre magique. - Maintenabilité : modifiez une valeur en un seul endroit plutôt que de chercher chaque littéral.
- Sécurité : la valeur est en lecture seule, elle ne peut donc pas être écrasée accidentellement n'importe où dans le code.
Conclusion
Le mot-clé const définit des constantes au moment de la compilation — aussi bien globales qu'à l'intérieur des classes — qui restent fixes pendant toute la durée de vie d'un script. Utilisez-le pour des valeurs fixes que vous connaissez toujours à l'avance, préférez les constantes de classe pour les valeurs appartenant à un type, et passez à define() lorsque vous avez besoin d'une constante créée conditionnellement ou avec un nom dynamique. Pour aller plus loin, continuez avec les chapitres sur les constantes PHP et les constantes de classe.