Programmiersprache PHP 8.2 bringt Read-only-Klassen und bessere Zufallszahlen
Neben Klassen, die nur Lesezugriff auf Properties erlauben, bringt das Release Ergänzungen für die Typen und eine neue API zum Generieren von Zufallszahlen.
- Rainald Menge-Sonnentag
Turnusmäßig zum Jahresende ist Version 8.2 der Programmiersprache PHP erschienen. Zu den Neuerungen gehören Read-only-Klassen, eine API zum Generieren von Zufallszahlen, drei eigenständige Typen und eine Verknüpfung von Intersection Types und Union Types.
Eine Klasse nur zum Lesen
Read-only-Klassen erweitern das in PHP 8.1 eingeführte Konzept der Readonly Properties. Ist eine Klasse als readonly
ausgezeichnet, gelten alle ihre Properties als Readonly. Außerdem ist es nicht erlaubt, der Klasse eine dynamische Property hinzuzufügen.
Weder nicht-typisierte noch statische Properties dürfen Bestandteil einer Read-only-Klasse sein, da beide nicht readonly
sein dürfen. Bei der Vererbung müssen Kindklassen ebenfalls als readonly
gekennzeichnet sein.
Dynamische Properties gelten mit dem aktuellen Release als überholt (deprecated). Mit PHP 9.0 wird ihr Einsatz eine ErrorException
auslösen. Eine Ausnahme stellt die leere stdClass
dar. Um sie in regulären Klassen zu verwenden, müssen sie das Attribut #[\AllowDynamicProperties]
haben.
Neue eigenständige Typen
Version 8.2 erlaubt drei neue eigenständige Typen: null
, false
und true
. Letzterer ließ sich bisher in Union Types verwenden, um beispielsweise mit string|null
einen Nullable-Rückgabewert zu deklarieren, der entweder ein String oder null
ist. Nun sind alle drei Typen auch als eigenständige Typen erlaubt:
class Falsy
{
public function alwaysFalse(): false { /* ... */ *}
public function alwaysTrue(): true { /* ... */ *}
public function alwaysNull(): null { /* ... */ *}
}
Ein einfaches return
aus den jeweiligen Funktionen ist nicht gestattet, sondern eine mit einem Rückgabewert null
deklarierte Funktion muss mit return null
zurückkehren. Als Motivation für die Neuerung nennt der zugehörige RFC (Request for Comments) unter anderem die Vervollständigung des Typsystems. Außerdem soll der eher seltene Fall abgedeckt sein, dass ein Rückgabewert der Union null | false
erfolgt, was bisher nicht erlaubt war.
Und trifft Oder
Die im aktuellen Release eingeführten Disjunctive Normal Form (DNF) Types kombinieren Union Types und Intersection Types. Die disjunktive Normalform ist eine normierte Funktionsdarstellung für Boolesche Funktionen, also Und- mit Oder-Verknüpfungen.
Union Types entsprechen einer Oder-Verknüpfung von Typen und sind mit |
kombiniert, während Intersection Types als Und-Verknüpfung mit &
zusammenstehen. Für die verbundenen DNF-Types müssen die Intersection Types mit Klammern gruppiert werden: (A&B) | (C&D)
. Ein Anwendungsfall ist ein Intersection Type, der Nullable ist: (IsNew & IsDone) | null
.
Eingebettete Konstanten
Als weitere sprachliche Neuerung sind die Konstanten innerhalb von Traits nennenswert. Der Zugriff erfolgt dabei ausschließlich über eine Klasse, die den Trait implementiert. Der Code darf nicht über den Namen des Traits auf die Konstante zugreifen:
trait Foo
{
public const CONSTANT = 1;
}
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error, da Zugriff ueber Trait
Ebenfalls neu ist, dass PHP 8.2 den Zugriff auf Properties von den in Version 8.1 eingeführten Enums in konstanten Ausdrücken mit ->
erlaubt:
enum A: string {
case Foo = 'foo';
}
const B = A::Foo->name;
Zufällige Erweiterung
Eine neue API für Zufallszahlen soll einige Schwächen der bisherigen Implementierung beheben. Unter anderem setzte PHP bisher auf den Mersenne-Twister-Pseudozufallszahlengenerator und erlaubt nicht, ihn auszutauschen. Zudem legte sie dessen Zustand global ab, ohne dass Programme darauf zugreifen können.
Die Erweiterung ist objektorientiert und bietet Klassen zum Integrieren anderer, womöglich aktuellerer Algorithmen. Diese legen ihren State in Objekten ab, was mehrere Sequenzen mit individuellen Seeds nebeneinander ermöglicht.
Weitere Neuerungen und Deprecations in PHP 8.2 lassen sich der Ankündigung entnehmen. Eine detailliertere Übersicht findet sich in der Dokumentation. Der Sourcecode und der Link zu Windows-Binaries finden sich auf der Download-Seite.
(rme)