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.

vorlesen Druckansicht 10 Kommentare lesen
Lesezeit: 3 Min.
Inhaltsverzeichnis

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.

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.

Videos by heise

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.

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.

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.

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;

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)