declare
Le mot-clé declare est une structure de contrôle PHP qui définit des directives d'exécution pour un bloc de code.
Le mot-clé PHP declare
declare est une structure de contrôle PHP qui définit une directive d'exécution pour le code qu'elle gouverne. Contrairement à la plupart des instructions, une directive n'exécute pas de logique — elle modifie la façon dont le moteur interprète le code environnant. PHP prend en charge exactement trois directives : strict_types (applique les déclarations de types), encoding (définit l'encodage des caractères du script) et ticks (un hook d'événement hérité, supprimé dans PHP 8.0).
La raison la plus courante d'utiliser declare aujourd'hui est une seule ligne en haut d'un fichier : declare(strict_types=1);. Cette page couvre la syntaxe, chaque directive et les pièges qui surprennent les développeurs.
Syntaxe
Il existe deux formes. La forme instruction applique la directive au reste du fichier :
declare(directive);La forme bloc applique la directive uniquement au code à l'intérieur des accolades :
declare(directive) {
// code block
}La forme bloc est uniquement valide pour ticks. strict_types et encoding doivent utiliser la forme instruction et doivent être la toute première instruction du fichier (seul <?php peut les précéder). Utiliser la forme bloc avec strict_types est une erreur fatale.
strict_types : application des déclarations de types
Par défaut, PHP coerce les arguments scalaires pour correspondre aux déclarations de types d'une fonction. Avec declare(strict_types=1);, ce n'est plus le cas — passer le mauvais type lève une TypeError. C'est la directive que vous utiliserez réellement au quotidien.
Deux règles à retenir :
- Elle doit être la première instruction du fichier. Tout ce qui la précède — même des espaces blancs en sortie ou une autre instruction — est une erreur fatale.
- Elle est par fichier. Le mode strict s'applique aux appels effectués depuis ce fichier, en fonction de l'emplacement de l'appel, et non de l'endroit où la fonction est définie. Une fonction de bibliothèque appelée depuis un fichier strict est vérifiée strictement ; la même fonction appelée depuis un fichier non strict ne l'est pas.
Sans la directive, add(2, "3") coercerait silencieusement "3" en 3 et retournerait 5 — ce qui est exactement le type de bug caché que strict_types est conçu pour révéler.
encoding : déclaration du jeu de caractères du script
declare(encoding='ISO-8859-1');Cela indique au moteur comment interpréter les octets du fichier script lui-même. C'est rarement nécessaire sur les systèmes modernes, qui utilisent l'UTF-8 partout, mais peut être utile pour les fichiers hérités ou des configurations serveur spécifiques. Cela n'a d'effet que lorsque PHP est compilé avec le support multioctet.
ticks : un hook d'événement hérité
Un tick est un événement déclenché tous les N instructions de bas niveau exécutées à l'intérieur du bloc declare. Il était utilisé pour greffer des callbacks simples (gestion des signaux, profilage) sur du code autrement synchrone. C'est la seule directive où la forme bloc a du sens :
declare(ticks=1) {
function tick_handler() {
echo "tick" . PHP_EOL;
}
register_tick_function('tick_handler');
$a = 1;
$a += 2;
}Le nombre exact de ticks dépend du nombre d'instructions exécutées. La directive ticks a été supprimée dans PHP 8.0 — évitez-la dans le nouveau code ; les alternatives modernes incluent pcntl_signal pour la gestion des signaux.
Quand utiliser chaque directive
strict_types=1— placez-la en haut de chaque nouveau fichier. C'est l'utilisation la plus précieuse dedeclareet une convention quasi universelle dans le PHP moderne. Voir PHP Data Types et PHP Functions pour comprendre le fonctionnement des déclarations de types.encoding— uniquement si vous avez réellement un fichier source non-UTF-8 et le support multioctet compilé.ticks— à éviter ; supprimé depuis PHP 8.0.
Conclusion
declare définit des directives d'exécution pour un script. En pratique, cela signifie une seule ligne — declare(strict_types=1); — qui transforme la coercition silencieuse de types en erreurs explicites et rend vos signatures de fonctions significatives. Les directives encoding et ticks sont respectivement de niche et héritées, mais les connaître toutes les trois évite que la syntaxe (forme instruction vs. forme bloc) ne vous surprenne.