Kevin Lopez hat sich in einer PHP-Internals-Diskussion an Larry und Ilija gewandt. Er betreibt eine produktive PHP-Anwendung, die die JSON-Antwort eines Modells ablehnt, sobald ein Feld fehlt oder den falschen Typ besitzt. Nach seiner Einschätzung könnte der aktuelle RFC-Entwurf zwei Antworten akzeptieren, die seine Anwendung zurückweisen muss.

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

Die Array-Muster im RFC prüfen mit array_key_exists(), ob ein Schlüssel vorhanden ist, bevor der Wert verglichen wird. Eine Implementierungsnotiz zum Pull Request 20574 in php/php-src beschreibt den Entwurf dagegen so, dass ein fehlendes Element als null gelesen wird. Dadurch würde `['a' => 42]` auf `['b' => null]` passen. Lopez bittet darum, den bestehenden RFC-Text beizubehalten. Für seinen Parser sind ein fehlender Schlüssel und ein vorhandener Schlüssel mit null unterschiedliche Zustände.

Sein Beispiel `partQuote()` verlangt für `part` einen String. `quote` darf fehlen, null oder ein String sein. Jeder andere Typ führt zu null als Rückgabewert. Wird `quote` übergeben, bleibt der Schlüssel im Ergebnis erhalten. Deshalb liefert ein Aufruf nur mit `part` `['part' => 'A']`. Ein expliziter Wert null für `quote` bleibt dagegen im Ergebnis sichtbar. Ein numerischer Wert für `quote` führt zu null.

Der zweite Punkt betrifft ein Feld für einen Wertungsbereich. `strength` muss zunächst is_int() erfüllen und danach zwischen 0 und 100 liegen. `'80'` scheitert als String, `80.0` als Float und `101` wegen des Bereichs. Für `relevant` gilt dieselbe Prüfung ohne Typumwandlung mit is_bool(): `1` und `'true'` scheitern. `strength` mit dem Wert 80 zusammen mit `relevant` auf true besteht. Ein Integer-Muster und ein Bereichsmuster wie `>=0 & <=100` müssen nach Lopez ebenfalls numerische Strings und Floats ablehnen, wenn sie dieses Feld prüfen. Er fordert keine neue Syntax, sondern eine konsistente Anwendung der bereits beschriebenen Regeln.