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




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.