PHP ist mittlerweile 26 Jahre alt. Die Programmiersprache dominiert weite Teile des Webs. Trotz des beachtlichen Alters wird die Programmiersprache regelmäßig weiterentwickelt: Vor fast genau einem Jahr wurde die Major Version 8 veröffentlicht, jetzt kommt mit Version 8.1 ein weiteres Update mit vielen neuen Features.
Neuer never-Rückgabetyp
Sogenannte return types – oder Rückgabetypen – beschränken den Rückgabetyp des Werts, der von einer Methode zurückgegeben wird. PHP 8.1 erlaubt mit never
einen neuen Rückgabetypen. Wer eine Funktion mit dem never
-Keyword versieht, definiert damit quasi, dass die Funktion entweder nie einen Wert und stattdessen eine sogenannte Exception zurückgibt oder alternativ die Funktion mit einem Exit-Call beendet. Der darin verbleibende Code wird dann nicht ausgeführt.
function no_value_returned(string $params): never {
... // code
exit();
}
Wenn die Funktion keine Exception zurückgibt oder sie nicht beendet wird, wirft PHP eine sogenannte TypeError-Exception:
// Type Error
TypeError: dispatch(): never-returning function must not implicitly return
Readonly-Properties
Die Property einer Klasse, die als readonly
deklariert wurde, kann nur ein einziges Mal initialisiert werden. Weitere Änderungen sind dann nicht mehr möglich.
class Dog {
public readonly string $dna;
public function __construct(string $dna) {
$this->dna = $dna;
}
}
$dog = new Dog("...");
Sie können nur von innerhalb der Klasse – im Beispiel der Klasse Dog
– gesetzt werden, entweder innerhalb eines Constructors oder einer anderen Methode. Nicht typisierte Properties können nicht als readonly
deklariert werden, das Keyword funktioniert nur bei typisierten Properties. Im oben stehenden Beispielcode ist die Property $dna
ein String. readonly
ist ein reserviertes Keyword, erlaubt aber dennoch die Deklaration von Funktionen mit dem Namen readonly
, weil einige PHP-Frameworks, darunter WordPress, ihre eigenen readonly
-Funktion deklarieren.
Enums
Die neue PHP-Version unterstützt sogenannte Enumerations, kurz Enums. Ein Enum ist ein mit einer Zahl versehener Typ, der eine feste Anzahl möglicher Werte hat. Ein Enum namens Status
sieht so aus:
enum Status
{
case DRAFT;
case PUBLISHED;
case ARCHIVED;
}
Enums repräsentieren eine Collection oder Sammlung kostanter Werte. Diese Werte – oder Values – können typisiert werden:
class BlogPost
{
public function __construct(
public Status $status,
) {}
}
Das enum Status
kann jetzt an die Klasse BlogPost
übergeben werden:
$post = new BlogPost(Status::DRAFT);
Enums können Methoden definieren, ähnlich wie Klassen. Auch können sie – wie Klassen – sogenannte Interfaces implementieren. Die Neuerung im Detail beschrieben hat Brent Roose in einem Blogpost.
Neue array_is_list-Funktion
Die neue array_is_list-Funktion gibt einen Wert vom Typ Boolean – also entweder true
oder false
– zurück. Die Funktion überprüft, ob der übergebene Array eine semantische Liste von Werten darstellt. true
wird zurückgegeben, wenn das zutrifft, alle Keys des betreffenden Arrays vom Typ integer sind, die Liste bei 0 anfängt und es keine Lücken zwischen den Werten gibt. Auch bei einem leeren Array gibt die array_is_list
-Funktion true zurück.
array_is_list([]); // true
array_is_list([1, 2, 3]); // true
array_is_list(['text', 2, 3]); // true
array_is_list(['text', 'sentence']); // true
array_is_list([0 => 'text', 'sentence']); // true
Sind die Keys implizit, geht PHP davon aus, dass sie bei 0 starten und dass es integer-Keys sind. Deutlicher wird das bei einem Blick auf Arrays, bei denen array_is_list
false
zurückgeben würde:
// Key does not start with 0
array_is_list([1 => 'text', 'sentence']); // false
// Keys are not in order
array_is_list([1 => 'text', 0 => 'sentence']); // false
// Non-integer keys
array_is_list([0 => 'text', 'foo' => 'bar']); false
// Non-sequential keys
array_is_list([0 => 'text', 2 => 'bar']); false
Fibers
Fibers sind ein Mechanismus, um parallel ablaufende Vorgänge zu ermöglichen. Ihr werdet sie wahrscheinlich nicht direkt selbst in euren PHP-Anwendungen verwenden, aber Frameworks wie Amphp oder ReactPHP greifen darauf zurück.
$fiber = new Fiber(function (): void {
$valueAfterResuming = Fiber::suspend('after suspending');
// …
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');
Array-Unpacking funktioniert jetzt auch mit string-Keys
Sogenanntes Array-Unpacking gibt es bereits seit PHP 7.4, allerdings funktionierte das Feature bis dato nur mit nummerischen Keys. Bisher wurden Keys vom Type string nicht unterstützt, weil es keinen Konsens darüber gab, wie Array-Duplikate zusammengeführt werden sollen. Das Team um PHP hat dieses Problem schlussendlich gelöst, indem sie dabei der Semantik von array_merge
folgen:
$array1 = ["a" => 1];
$array2 = ["b" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 1, "b" => 2]
Weitere Neuerungen und Breaking Changes
Daneben bringt PHP 8.1 eine ganze Reihe weiterer Neuerungen, darunter sogenannte intersection-types, zwei neue Funktionen namens fsync
und fdatasync
, Performanzverbesserungen sowie ein neues final
-Keyword, das das Überschreiben von Klassenkonstanten bei der Vererbung verhindert. Zudem bringt Version 8.1, trotz dass es sich dabei um einen Minor-Release handelt, wohl einige kleinere nicht abwärts kompatible Änderungen und Deprecations mit sich. Wer auf die neue Version migriert, findet im zugehörigen Migration-Guide sowie in den PHP-Wikipages alles Wissenswerte darüber zum Nachlesen.