PHP 8: Alle Informationen zur neuen Version

PHP ist eine der Programmiersprachen, die am einfachsten zu lernen ist. Mit einem PHP-Tutorial und der richtigen Motivation, kann man innerhalb weniger Stunden die ersten Skripte schreiben und Befehle ausführen. PHP 7 hat  bereits eine starke Geschwindigkeitsoptimierung gebracht, die zu einem verbesserten Ranking führte. Nun hat die Open-Source-Sprache ein Major-Update auf Version 8.0 erhalten. Ein Jahr später folgt auch schon das kleinere Update auf 8.1.

Welche Features kommen mit PHP 8.1?

PHP 8.1 ist inzwischen in der Beta-Version erschienen und wird gerade getestet. Das endgültige Update folgt zwar erst im November 2021, doch die neuen Features sind bereits bekannt. Auf folgende Neuerungen können Sie sich einstellen:

  • Enum: Sogenannte Enumerations (Aufzählungen mit einer bestimmen Anzahl von Werten) sind nun als Variablentyp verfügbar.
  • Fibers: Der neue Code-Block-Typus Fibers gibt Ihnen die Möglichkeit, mehrere Programmfäden parallel auszuführen.
  • Arrays: Seit PHP 7.4 kann man Arrays mit numerischen Werten entpacken. Nun ist dies auch für Arrays mit Strings möglich.
  • Readonly: Klasseneigenschaften können von nun an als Readonly markiert werden und sind somit nicht mehr veränderbar.
  • Intersection: Intersection Types (im Prinzip die Gegenspieler zu den Union Types) sind nun verfügbar.
  • Never: Der neue Rückgabewert ‚never‘ zeigt an, dass eine Funktion beendet wird und keinen anderen Wert zurückliefert.
  • Final: Man kann Klassenkonstanten nun mit ‚final‘ markieren, damit sie nicht von Unterklassen geändert werden können.
  • Fsync: Mit PHP 8.1 werden die beiden Funktionen ‚fsync‘ und ‚fdatasync‘ eingeführt, um Daten aus dem Buffer auf das Speichermedium zu synchronisieren.
  • Octal: Um das Oktalzahlensystem anzuzeigen, kann man künftig zusätzlich zu ‚0‘ (Null) auch das Präfix ‚0o‘ (Null und kleines O) verwenden.
  • Globals: Die Nutzung von ‚$GLOBALS‘ wurde leicht eingeschränkt und führt nun in manchen Fällen zu einer Error-Nachricht.
  • Null: Interne Funktionen akzeptieren fortan keine Null-Werte mehr bei Non-nullable-Argumenten.
Hinweis

Dies ist nur eine Auswahl der interessantesten Änderungen in PHP 8.1. Viele weitere geplante Neuerungen finden Sie in der offiziellen Wiki mit allen Request for Comments.

PHP 8: Release im November 2020

Am 26. November 2020 war es so weit: Mit dem Major-Release PHP 8.0.0 wurde die neueste Ausgabe der beliebten Skriptsprache veröffentlicht. Dies entspricht dem normalen Drei-Jahres-Zyklus bei PHP. Der Vorgänger PHP 7.4 war zuvor rund ein Jahr lang aktiv, nachdem u. a. der Support für PHP 7.1 eingestellt worden war. Auch der Support für PHP 7.2 ging Ende 2020 zu Ende.

Viele Websites, die mit PHP geschrieben wurden, setzen dennoch auf die alten Versionen. Dies ist zwar prinzipiell möglich, allerdings nicht zu empfehlen. Den Code der Website aktuell zu halten und auf neue Versionen von PHP umzusteigen bringt nämlich verschiedene Vorteile mit sich: Neue Funktionen bieten mehr Vielfalt, die Performance kann massiv gesteigert werden und Sicherheitslücken werden geschlossen.

PHP 8 schon jetzt probieren!

Sie sind noch kein IONOS-Kunde? Dann buchen Sie jetzt eines unserer günstigen Webhosting-Angebote. Anschließend können Sie in Ihrem IONOS-Kundenkonto die verwendete PHP-Version ändern und zu PHP 8 bzw. PHP 8.1 (sobald verfügbar) wechseln.

Gibt es Komplikationen mit altem Code?

Da PHP 8 eine neue Hauptversion ist, muss man damit rechnen, dass alter Code nicht mehr kompatibel sein kann. Die meisten Änderungen, die zu Komplikationen führen könnten, waren allerdings schon in Version 7.2, 7.3 und 7.4 veraltet.

Zu den aktuellen Änderungen gehören:

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Reflection export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

Wer seinen Code bisher immer up to date gehalten hat, wird kaum Probleme haben, auch wenn das neue Update ein Major-Release ohne abwärtskompatible Änderungen ist. Eine komplette Auflistung aller Änderungen kann man auf der offiziellen PHP-Projektseite einsehen.

Hinweis

Microsoft hat bekannt gegeben, dass das Unternehmen für PHP 8 und spätere Versionen keinen Windows-Support mehr anbieten wird. Die PHP-Entwickler haben allerdings bereits angekündigt, diese Lücke selbst schließen zu wollen.

Das sind die neuen PHP-8-Features

Die neue Version von PHP birgt einige Neuerungen, die Webentwicklern viele zusätzliche Möglichkeiten bieten. Die wichtigsten Anpassungen gegenüber den Vorgängern haben wir im Folgenden für Sie zusammengefasst.

Hinweis

Am 30. November 2020 erreicht die PHP 7.2 Version das offizielle End-of-Life-Datum (EOL) und wird nicht mehr unterstützt. Mehr dazu finden Sie in unserem Artikel zu diesem Thema.

JIT Compiler

Die größte Neuerung ist der JIT Compiler, der die Performance erheblich verbessern soll. PHP wird nicht kompiliert, sondern Zeile für Zeile interpretiert. Der JIT Compiler (JIT = Just in Time) kompiliert nun Teile des Codes während der Laufzeit – und wirkt somit ganz ähnlich wie eine gecachte Version des Codes.

Dieses neue Feature in PHP 8 wurde auch bereits von Pedro Escudero eindrucksvoll getestet. Er hat ein simples Script genutzt und damit die Versionen 5.3, 7.4 und 8 (mit und ohne JIT) verglichen. Hierfür hat er das Script in jeder Version 100-mal laufen lassen und anschließend die Durchschnittszeit ermittelt.

Dabei sind folgende Durchschnittswerte entstanden:

Version Zeit in Sekunden
5.3 0.64574003219604
7.4 0.10253500938416
8 (ohne JIT) 0.098223924636841
8 (mit JIT) 0.053637981414795

Auch wenn der Wechsel von Version 7.4 zu 8 ohne JIT keinen großen Unterschied macht, so ist der Unterschied zu Version 8 mit JIT erheblich. Der JIT Compiler sorgt für ein Performance-Upgrade von mehr als 45 Prozent.

Union Types

Union Types kennt man bereits aus anderen Sprachen wie C/C++, TypeScript oder auch Haskell. Hierbei können zwei oder mehrere Typen eine Union eingehen und jeder der genannten Typen kann verwendet werden. Im Code selbst kann dies folgenderweise aussehen:

public function foo(Foo|Bar $input): int|float;

Es gibt jedoch eine Einschränkung, denn void kann nicht Teil eines Union Types werden, da es keinen Rückgabewert ausgibt. Außerdem können nullable Unions mit |null oder ? geschrieben werden, wie in diesem Beispiel

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Static return type

Static ist ein spezieller Klassenname und wird in der neuen Version neben self & parent zu einem validen Return Type.

WeakMap

WeakRefs wurden bereits in PHP 7.4 hinzugefügt, PHP 8 liefert mit WeakMaps die Erweiterung dieser Funktion. WeakMaps und WeakRefs können dazu genutzt werden, Objekte zu löschen, wenn nur noch der Cache auf die Entitätsklassen der Objekte referenziert. Dies führt zu einem ressourcenschonenden Umgang mit den Objekten. Ein Beispiel aus der Dokumentation:

class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...
}

::class bei Objekten verwenden

In früheren Versionen musste man get_class() benutzen, um Objekten eine Klasse zuzuweisen. Nun können Sie ::class auf Objekte anwenden, was den Quelltext schlanker hält.

Stringable interface

Das Stringable interface wird automatisch zu Klassen hinzugefügt, die die __toString()-Methode implementieren. Dieser Schritt musste bisher manuell vollzogen werden. Im Code selbst sieht das dann folgendermaßen aus:

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');

fdiv()-Funktion

Durch die neue Funktion fdiv() ist eine Division durch 0 erlaubt. Man erhält nun INF, -INF oder NAN als Rückgabewert.

Typen-Fehler (Type errors)

Bisher lösten nur benutzerdefinierte Funktionen TypeErrors aus, interne Funktionen haben eine Warnung und null ausgegeben. In PHP 8 geben nun auch die meisten internen Funktionen einen Typen-Fehler aus.

Neue Klassifizierung von Engine-Warnings

Bisher gab es viele Fehler, die nur eine Warnung oder einen Hinweis ausgegeben haben. Dies wurde nun aktualisiert. Eine vollständige Auflistung der neuen PHP-Fehlermeldungen finden Sie in der Dokumentation.

Korrekte Signaturen magischer Methoden

In den bisherigen PHP-Versionen war es möglich, magische Methoden mit Signaturen zu schreiben, die nicht mit der erwarteten Signatur übereinstimmen, beispielsweise __clone(): float oder __isset(): Closure. Seit der Einführung von PHP 7.0 wurde die korrekte Anwendung der magischen Methoden nur stichprobenartig überprüft. Die neue Version ist um diverse Parameter- und Rückgabewert-Checks ergänzt worden, um die Korrektheit der Signaturen sicherzustellen.

Reflection

Die Reflection-Signaturen wurden geändert. Ursprünglich wurde Reflection folgenderweise angegeben:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

In PHP 8 wird es nun folgendermaßen geschrieben:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

Um PHP 7 & PHP 8 gleichzeitig zu unterstützen, können Sie den Code folgenderweise formulieren:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
Tipp

Sie sind noch nicht mit einer eigenen Website aktiv? Das Dedicated Hosting von IONOS ist leistungsstark und auch für Einsteiger empfehlenswert. Besonders viel Flexibilität bei bester Performance erwartet Sie außerdem bei den virtuellen Servern von IONOS. Entscheiden Sie sich für das Angebot, das am besten zu Ihrem Projekt passt.