bsod.wtf

Bild: Peter Masełkowski/Unsplash

PHP 8.4: Implizite Nullable Parameter-Typen werden wohl deprecated

Kürzlich sahen die anstehenden Änderungen in PHP 8.4 noch vergleichsweise harmlos aus. Doch jetzt steht etwas zur Abstimmung, das seinen Weg in PHP 8.4 finden soll und eine neue Deprecated-Meldung werfen könnte. Es geht um implizite Nullable Parameter-Typen. Der Vorschlag möchte damit eine alte Karteileiche in der Sprache beheben, die seinerzeit als „notwendiges Übel“ implementiert wurde – und nicht erst heute für Verwirrung sorgt.

Worum geht es?

Die RFC beschreibt genau, was der Hintergrund der Änderung sein soll. Das „Problem“ heißt Type Hinting. Damit kannst du im Code den Typ der Variable hinterlegen, die ein Parameter einer Funktion annehmen kann. Eine klassische PHP-Funktion könnte so aussehen:

function foo($variable) {}

Per se könnte $variable von einem beliebigen Typ sein. Seit PHP 5.1 kannst du PHP mitteilen, dass $variable vom Typ array sein muss:

function foo(array $variable) {}

Später kamen noch weitere Typen hinzu (5.4: callable, 7.0: skalare, also int, float und so weiter). PHP hat es jedoch erlaubt, dass $variable auch null sein darf – wenn du einen „Standardwert“ auf null setzt. Dann sähe der Code so aus:

function foo(array $variable = null) {}

Das ist jedoch wenig intuitiv und wird richtig ekelig, wenn eine solche Variable nicht am Ende steht. Dann sieht es nämlich so aus, als könnte man den Parameter auch weglassen. Das ist jedoch nur erlaubt, wenn ausschließlich optionale Parameter folgen. Deshalb wirft PHP entsprechend eine Warnung seit Version 8.0.

In PHP 7.1 wurde das Problem formell gelöst. Diese Version führte Nullable Typ-Deklarationen ein. Sie werden mit einem Fragezeichen eingeleitet. Ab PHP 7.1 würde der Code also folgendermaßen aussehen (zum Vergleich auch im alten Syntax):

// PHP 5.1+, Deprecation-Meldung in 8.4
function foo_php51(array $variable = null) {}
foo_php51(null); // erlaubt
foo_php51(); // ebenfalls erlaubt, $variable wird als null (Standardwert) angenommen

// PHP 7.1+
function foo_php71(?array $variable) {}
foo_php71(null); // erlaubt ab 7.1, auch in 8.4
foo_php71(); // Fehler, weil Pflicht-Parameter nicht gesetzt ist

Der Vorschlag möchte darauf hinaus, dass die erlaubten Datentypen für Parameter korrekt benannt werden und die alte Behelfslösung abschaffen. Das hat zudem den Vorteil, dass du zwar erlauben kannst, dass $variable = null wird, aber das nicht der Standardwert sein muss, falls kein Parameter angegeben ist. Du kannst ihn also als notwendigen Parameter definieren.

Abstimmung für PHP 8.4 findet statt

Momentan findet bei PHP die Abstimmung statt, ob diese Änderung wirklich in die nächste PHP-Version eingepflegt werden soll. Wie bei jeder RFC ist eine 2/3-Mehrheit für eine Implementierung notwendig. Aktuell ist das Zwischenergebnis mit 14:1 für den Vorschlag ziemlich eindeutig. Die Abstimmung läuft noch bis 13. März 2024.

Da die alte „Lösung“ gewissermaßen schon immer suboptimal war, die neue ab PHP 7.1 funktioniert und selbst PHP 7.1 längst veraltet ist, solltest du also deinen Code nach derartigen Abominationen durchsuchen. Wirst du fündig, solltest du das Fragezeichen setzen und den Standardwert = null nur dann drin lassen, wenn es wirklich gewünscht ist, dass der Parameter weggelassen werden darf und dann als null in der Funktion verwendet wird.

Wenn der Vorschlag angenommen wird, wirft PHP andernfalls ab Version 8.4 eine Deprecated-Meldung. Die ist einmal unschön in den Logfiles und bedeutet außerdem, dass dein Code in PHP 9 gar nicht mehr funktioniert. Doch auch unabhängig vom Ausgang der Abstimmung solltest du die Änderungen vornehmen.

Schreibe einen Kommentar