€0.00 — free as in speechtonight's forecast: clear skies over production Cache: warm · Deploys: fair, 0% rollbacks expectedset by moonlight, shipped before dawn · deploy freely Page A2

❦The Daily Commit❦ ☾The Nightly Build☽

Dev news, typeset daily — PHP · AI · The Wider Stack

The developer's evening paper — PHP · AI · The Wider Stack

lunes, 9 de noviembre de 2026 Vol. I — No. 895 · Edición matinalEdición vespertina EN DE FR ES

PHP · RFC Watch

El RFC de PHP debate claves ausentes y tipos enteros

Kevin Lopez plantea dos cuestiones semánticas sobre el borrador del RFC de PHP para pattern matching.

seleccionado por Sönke

Los patrones de arrays deberían distinguir una clave ausente de un null explícito mediante array_key_exists(). Los patrones de enteros y los rangos numéricos deberían rechazar cadenas y valores float aunque estén dentro del intervalo. El caso de uso es validar JSON de modelos con tipos exactos.

Kevin Lopez se dirigió a Larry e Ilija en un debate de PHP Internals sobre el borrador del RFC Pattern Matching. Mantiene una aplicación PHP en producción que rechaza la respuesta JSON de un modelo cuando falta un campo o su tipo no coincide con el esperado. Según Lopez, el borrador actual podría aceptar dos respuestas que la aplicación debe rechazar.

partQuote.php
<?php
function partQuote(array $p): ?array {
 if (!is_string($p['part'] ?? null)) {
 return null;
 }
 if (array_key_exists('quote', $p) && $p['quote'] !== null && !is_string($p['quote'])) {
 return null;
 }
 $out = ['part' => $p['part']];
 if (array_key_exists('quote', $p)) {
 $out['quote'] = $p['quote']; // null is kept; the key was present
 }
 return $out;
}

Las reglas del RFC para patrones de arrays usan array_key_exists() antes de comparar el valor. Sin embargo, una nota de implementación de la pull request 20574 de php/php-src indica que el borrador interpreta un elemento ausente como null. Con esa lectura, `['a' => 42]` coincidiría con `['b' => null]`. Lopez pide conservar el texto actual del RFC porque su analizador considera distintos una clave ausente y una clave presente con valor null.

Su ejemplo `partQuote()` exige que `part` sea una cadena. `quote` puede faltar, ser null o ser una cadena. Cualquier otro tipo produce null. Cuando se proporciona `quote`, la clave se conserva en el array de salida. Por eso, una llamada que solo contiene `part` devuelve `['part' => 'A']`. Una llamada con `quote` igual a null conserva esa clave en el resultado. Un valor numérico para `quote` devuelve null.

La segunda cuestión afecta a un campo de puntuación. `strength` debe superar primero la comprobación is_int() y después quedar entre 0 y 100, ambos incluidos. `'80'` falla por ser una cadena. `80.0` falla por ser un float y `101` queda fuera del rango. Para `relevant` se aplica la misma regla sin coerción mediante is_bool(): fallan `1` y `'true'`. La combinación de `strength` con valor 80 y `relevant` con valor true sí pasa. Lopez sostiene que un patrón entero y uno de rango, como `>=0 & <=100`, también deben rechazar cadenas numéricas y floats cuando se usan para ese campo. No solicita nueva sintaxis, sino una aplicación coherente de las reglas ya descritas.

Leer la fuente original (en inglés) ↗

Valora este artículo: 0

Tribuna de lectores

Aún no hay aportaciones — abre el debate.

← The Daily CommitThe Nightly Build — Page A1