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.

In Pocket speichern vorlesen Druckansicht 11 Kommentare lesen
Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
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.

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)