The Daily Commit · Édition de rubrique La une PHP AI Dev EN DE FR ES

The Php Times

RFC Watch — Écosystème

RFC PHP : des types scalaires littéraux dans le système de types ?

PHP INTERNALS ([RFC]/[VOTE]), 23 juillet 2026 sélectionné par Sönke

Un nouveau RFC de Seifeddine Gmati (implémentation : PR php-src #22314) propose des types scalaires littéraux pour PHP, permettant aux signatures de déclarer des valeurs exactes comme -1|0|1 ou "ascii"|"utf-8" plutôt que seulement int ou string. La discussion sur Internals a comparé l'idée aux enums, débattu des problèmes de précision des littéraux float, et évoqué d'éventuelles plages numériques ou alternatives de pattern matching.

Le contributeur PHP Seifeddine Gmati a ouvert la discussion sur un nouveau RFC intitulé « Literal Scalar Types » (implémentation : pull request php-src #22314). La proposition permettrait aux déclarations de type de désigner directement des valeurs scalaires précises, comme -1|0|1 ou "ascii"|"utf-8", plutôt que les seuls types de base int ou string.

Gmati fait valoir que la fonctionnalité couvre des cas que les enums ne peuvent pas structurellement atteindre : des API existantes déjà typées int ou string (comme le paramètre $mode d'array_filter) pourraient recevoir un contrat plus précis sans casser le code appelant ; des ensembles de valeurs ouverts (noms d'encodage, par exemple) pourraient s'élargir de façon contravariante sans forcer les consommateurs à ajouter un cas par défaut ; enfin, une valeur littérale reste un scalaire pur, utilisable comme clé de tableau, comparable avec === et compatible JSON sans les conversions ->value/::from() qu'exigent les enums.

Plusieurs relecteurs ont contesté ces arguments. David Gebler a douté que les enums soient aussi fragiles face à l'ajout de nouveaux cas. Tim Düsterhus a cité la migration de l'enum RoundingMode (issue du RFC « Correctly name the rounding mode ») comme preuve qu'on peut retyper une API scalaire vers un enum via un chemin de dépréciation, et a mentionné une ébauche « non_exhaustive_marker » pour formaliser les enums non exhaustifs.

Sur le périmètre, le RFC exclut la référence à des constantes ou des cas d'enum en position de type (ambiguïté avec les noms de classe ; une valeur d'enum est une expression à l'exécution, pas un littéral), ainsi que NAN/INF, qui sont des constantes et non des littéraux. Le mélange de types littéraux avec des types de base plus larges dans une union (par exemple int|'bar') est explicitement autorisé par conception.

Le point le plus disputé concerne les littéraux flottants : Düsterhus et Larry Garfield ont estimé que les floats sont trop imprécis pour une correspondance exacte (0.1 + 0.2 !== 0.3) et ont recommandé de limiter la fonctionnalité aux littéraux int et string ; Gmati s'est dit désormais enclin à abandonner le support des floats.

Andreas Heigl a suggéré des plages numériques (par exemple int 1..PHP_INT_MAX) comme suite logique ; Gmati a approuvé l'idée tout en estimant qu'elle mérite un RFC séparé vu sa complexité propre (bornes, inclusion, coercion). Bob Weinand et Sarina Corrigan ont évoqué le pattern matching (via la proposition de portée future « Parameter or return guards » du RFC Pattern Matching de Larry Garfield et Ilija) comme alternative potentiellement plus générale ; Gmati considère les types littéraux comme une brique distincte et complémentaire du système de types, utile aussi aux futurs types de tuples et de formes de tableaux (« array shapes »).

Gmati a également proposé de scinder le futur vote en questions séparées portant sur les littéraux string, int et float, ainsi que sur le mode de coercion (correspondance stricte par identité, comme pour true/false/null, ou coercion classique).

Lire la source originale (en anglais) ↗

Évaluer cet article : 0

Tribune des lecteurs

Pas encore de contributions — lance le débat.

← Écosystème — Page B1

"All the Code That's Fit to Ship" · The Daily Commit · Édition écran · Mentions légales · Politique de confidentialité