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




Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
Rien reçu ? Vérifiez le dossier spam — et marquez le message « Non spam » pour qu'il arrive directement la prochaine fois.