Kevin Lopez s'est adressé à Larry et Ilija dans une discussion de PHP Internals consacrée au projet de RFC Pattern Matching. Il maintient une application PHP en production qui rejette la réponse JSON d'un modèle lorsqu'un champ manque ou possède un type inattendu. Selon lui, le projet actuel pourrait accepter deux réponses que cette application doit refuser.

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;
}

Les motifs de tableaux du RFC vérifient la présence de la clé avec array_key_exists() avant de comparer sa valeur. Une note d'implémentation liée à la pull request 20574 de php/php-src indique toutefois qu'un élément absent est lu comme null dans le projet. Ainsi, `['a' => 42]` correspondrait à `['b' => null]`. Lopez demande de conserver le texte actuel du RFC, car son parseur distingue une clé absente d'une clé présente dont la valeur est null.

Dans son exemple `partQuote()`, `part` doit être une chaîne. `quote` peut manquer, contenir null ou contenir une chaîne. Un autre type provoque le retour de null. Lorsque `quote` est fourni, la clé est conservée dans le tableau produit. L'appel qui ne fournit que `part` renvoie donc `['part' => 'A']`. Un appel qui fournit explicitement null pour `quote` conserve cette clé. Une valeur numérique pour `quote` renvoie null.

Le second point porte sur un champ de score. `strength` doit d'abord satisfaire is_int(), puis se trouver entre 0 et 100 inclus. `'80'` échoue à cause de son type chaîne. `80.0` échoue comme flottant et `101` dépasse la limite. Pour `relevant`, la vérification sans conversion repose sur is_bool(): `1` et `'true'` échouent. La combinaison de `strength` à 80 et de `relevant` à true réussit. Lopez estime qu'un motif entier et un motif d'intervalle tel que `>=0 & <=100` doivent eux aussi refuser les chaînes numériques et les flottants lorsqu'ils remplacent le contrôle de ce champ. Il ne demande pas de nouvelle syntaxe, mais une application uniforme des règles existantes.