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.
<?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.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.