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.