La synthèse du 24 septembre 2026 couvre douze sujets des Internals de PHP. La branche PHP 8.6 a été créée mardi, le gel des fonctionnalités est en vigueur et la branche principale vise désormais PHP 8.7. Le premier release candidate était attendu le 24 septembre. Aucun sujet n’était passé au vote depuis six semaines.

Les échanges sur le RFC Time\Instant et Time\Clock se sont poursuivis après son ouverture par Tim Düsterhus et Derick Rethans. Time\Instant représente un point de la ligne temporelle avec une précision à la nanoseconde. Cette représentation exclut les fuseaux horaires et ignore les secondes intercalaires. La classe ne lit pas l’heure courante par elle-même. Time\Clock définit now(), et SystemClock fournit l’implémentation système. Tim estime que cette organisation facilite l’injection d’une horloge dans le code. Seifeddine Gmati a proposé une méthode statique now() et le nom SystemTime. Instant serait alors réservé à une horloge monotone. Tim a relié le nom retenu à Java et à Temporal en JavaScript. Une fonction Time\now() pourrait suivre en PHP 8.7. Larry Garfield soutient l’orientation et demande une feuille de route pour l’ensemble de la nouvelle API temporelle. Il a aussi interrogé le format de sérialisation. Tim considère que l’inspection de données sérialisées correspond à un usage inhabituel.

La principale question du RFC PREG_THROW_ON_ERROR concernant les callbacks a reçu une réponse. Une exception lancée dans preg_replace_callback doit parvenir à l’appelant sans transformation. Osama Aldemeery a cité des langages comme Python et Java, qui suivent cette règle. Son analyse de 4 865 paquets indique que ces callbacks représentent 4,9 % des appels aux huit fonctions concernées. Tim Düsterhus reste favorable à un wrapping selon la politique générale sur les throwables, sans vouloir l’imposer. Il demande deux ajustements : les erreurs de syntaxe dans les motifs doivent devenir des PcreError, et preg_last_error doit conserver sa valeur actuelle.

Gina P. Banyard a publié un pré-RFC Regex\CompiledRegex accompagné d’un prototype. La classe accepte un motif UTF-8 sans délimiteurs et des options booléennes nommées, comme la sensibilité à la casse et la gestion multiligne, complétées par dot-matches-newline. Les lettres de modificateur disparaissent ainsi que le besoin d’appeler preg_quote. Le modificateur D est toujours actif. Les erreurs de compilation utilisent Regex\CompilationError. Le prototype ne fonctionne pour l’instant qu’avec preg_split et preg_grep. Gina voit une base possible pour une API regex orientée objet dont match() renverrait un booléen, mais cette API n’est pas encore conçue. Le fil ne comptait aucune réponse mercredi soir.

Une proposition d’exécution par la CLI d’une Closure renvoyée par un fichier PHP a été retirée après environ 24 heures. Tim l’avait préparée à la demande de Gina pour qu’un même fichier serve de bibliothèque lorsqu’il est inclus et de commande lorsqu’il est lancé directement. Seifeddine Gmati s’est déclaré favorable au principe. Rowan Tommins préfère l’attribut #[EntryPoint] de Hack, car la fonction d’entrée pourrait se trouver n’importe où dans le fichier. Levi Morrison a questionné la portée limitée à la CLI et cité Symfony Runtime, qui renvoie déjà une closure depuis un front controller. Larry Garfield juge l’exécution automatique d’une valeur de retour trop indirecte. Tim souhaite maintenant étudier une constante __MAIN__ contenant le chemin du premier script lancé. Alexandru Pătrănescu a répondu que realpath appliqué au nom du fichier fournit déjà cette information.

Andrey Andreev a demandé si PASSWORD_DEFAULT devait passer de bcrypt à Argon2id. Bcrypt tronque silencieusement les mots de passe au-delà de 72 octets. Argon2 peut utiliser libsodium ou OpenSSL depuis PHP 8.4. Casper Langemeijer voit dans cette dépendance un coût et un avantage, puisqu’une bibliothèque cryptographique maintenue reste préférable à du code maison. Anton Smirnov a renvoyé à une discussion de 2023 selon laquelle Argon2 pouvait être moins robuste que bcrypt avec des paramètres adaptés à la connexion. Tim Düsterhus estime que 500 millisecondes sont excessives pour une authentification interactive. Andrey a mesuré environ 240 millisecondes avec les paramètres par défaut d’Argon2, soit un temps proche de bcrypt avec un coût de 12.

Jakub Zelenka a rappelé qu’OpenSSL est une bibliothèque partagée externe et ne peut donc pas être activée sur chaque build. En faire une exigence nécessiterait un RFC séparé. Le maintien d’OpenSSL 1.1.1 et 3.0 prolongerait aussi la transition. Andrey en a conclu que le changement de valeur par défaut n’avançait pas pour le moment.

Sepehr Mahmoudi a proposé str_mask le lendemain du retrait de array_str_contains. La fonction remplacerait une partie d’une chaîne par un caractère répété, pour des données comme les numéros de carte et les téléphones. Osama Aldemeery l’a comparée à l’association de substr_replace et str_repeat. Pratik Bhujel a relevé deux problèmes : un offset hors limites laissait la valeur visible, et un caractère multioctet utilisé comme masque pouvait être tronqué à un octet. La proposition a alors prévu une exception ValueError. Un attribut #[SensitiveParameter] a été ajouté puis supprimé, car une valeur masquée n’est pas nécessairement sensible. Laravel possède Str::mask et CakePHP Text::mask pour une opération proche. Ces API gèrent différemment les caractères multioctets et les limites. Casper Langemeijer juge la fonction facile à réaliser dans le code utilisateur. Weilin Du a montré que substr_replace pouvait effectuer l’opération avec une seule allocation. Après 30 messages, aucun vote n’était prévu.

Plusieurs réponses ont mis en doute l’usage d’outils d’IA pour rédiger certains RFC et messages de la liste. La critique portait sur la qualité et sur le temps de revue demandé aux mainteneurs. Pratik Bhujel a proposé de démontrer le cas d’usage, de fixer le contrat, puis de mesurer l’implémentation. Il a retiré un RFC et construit et testé son travail localement en premier. Juris Evertovskis a indiqué que le travail produit devait guider l’évaluation.

Le vote du RFC IntlRelativeDateTimeFormatter pourrait commencer le 8 octobre après une révision de Weilin Du. Cette version utilise les enums de Tim et a reçu son approbation. Nick S. prévoit d’ouvrir le vote sur PEAR le 28 septembre en l’absence d’objection.

L’extension php-terminal de Pratik Bhujel ajoute le mode brut et la lecture d’une seule touche. Des outils comme Laravel Prompts peuvent ainsi fonctionner correctement sous Windows. L’installation passe par PIE. Après la revue de Tim, le projet utilise l’espace de noms Io\Terminal, des enums non adossés, la restauration du terminal à la destruction de l’objet et une API centrée sur un seul objet. Le projet relève désormais de PHP 8.7.

David Maye Kitenge a demandé des précisions sur le cycle de vie des requêtes et les threads pour un framework web prévu sous forme d’extension PHP. Rowan Tommins a répondu que la CLI laisse la parallélisation au programme qui la lance. Un thread par requête nécessiterait un build ZTS thread-safe. Une gestion asynchrone dans un thread unique reste l’autre modèle évoqué.