PHP 8: Alle Informationen zu dem neuen Update

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. Die aktuelle Version PHP 7 hat eine starke Geschwindigkeitsoptimierung gebracht, die zu einem verbesserten Ranking führte. Doch nun bekommt die Open-Source-Sprache ein Major Update auf Version 8.0.

Der Entwickler Brent Roose hat kürzlich eine Mitteilung zu allen neuen Features des PHP-8-Releases veröffentlicht. Da noch aktiv an der neuen Version gearbeitet wird, dürften in den nächsten Monaten bis zum finalen Release noch mehr Änderungen bekanntwerden.

Wann kommt PHP 8?

Ein festes Veröffentlichungsdatum für die neue Version gibt es zwar noch nicht, aber es wurde für Ende 2020 angekündigt. Dies entspricht dem normalen 3 Jahreszyklus bei PHP. Weiterhin wurde PHP 7.4 im Dezember 2019 veröffentlicht und der Support für PHP 7.1 inzwischen eingestellt. Viele Webseiten, die mit PHP geschrieben wurden, benutzen also noch eine alte Version, die bald nicht mehr unterstützt wird. Den Code der Webseite aktuell zu halten und auf neue Versionen von PHP zu setzen bringt jedoch einige Vorteile mit sich. Neue Funktionen bieten mehr Vielfalt, die Performance kann massiv gesteigert werden und Sicherheitslücken werden geschlossen.

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ärtskompatiblen Änderungen sein wird. Eine komplette Auflistung aller Änderungen kann man auch in den Upgrade Notes bei GitHub einsehen.

Das sind die neuen PHP-8-Features

Die neue Version von PHP kommt voraussichtlich mit einigen Neuerungen, die Web-Entwicklern viele zusätzliche Möglichkeiten bieten.

JIT Compiler

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

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 %.

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 jede 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, nun kommt 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 kann man allerdings ::class auf Objekte anwenden. Das hält den Quelltext oft schlanker.

Stringable interface

Das stringable interface implementiert eine Schnittstelle automatisch. Dieser Schritt musste bisher manuell vollzogen werden. Dies kann bei allen Strings stattfinden oder dort, wo __toString() implementiert ist. 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');

DateTime konvertieren

Mit PHP 8 ist es bedeutend einfacher, DateTime zu konvertieren. Die Entwickler haben DateTime::createFromInterface() und DatetimeImmutable::createFromInterface() hinzugefügt. Dadurch ist es nun möglich, DateTime und DateTimeImmutable ineinander zu konvertieren.

fdiv

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

Type annotations

In der neuen Version werden korrekte Typenannotationen für alle internen Funktionen und Methoden hinzugefügt.

Type errors

Bisher lösten nur benutzerdefinierte Funktionen TypeErrors aus, interne Funktionen haben eine Warnung und null ausgegeben. Ab PHP 8 werden auch interne Funktionen TypeErrors ausgeben.

Reclassified 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.

Default error reporting level

Fehler, die bisher unbemerkt ignoriert wurden, werden zukünftig als E_ALL, E_NOTICE und E_DEPRECATED ausgegeben. Diese Fehler existierten bereits vor Version 8, wurden allerdings nicht offensichtlich gekennzeichnet.

@ unterdrückt fatal errors nicht mehr

Auch mit diesem neuen Feature werden Fehler aufgedeckt. Statt diese, wie bisher üblich, über den @-Operator zu unterdrücken, sollte man nun sichergehen, display_errors=Off auf dem Server eingestellt zu haben.

Reihenfolge von Verkettungsoperatoren

Dies wurde bereits mit PHP 7.4 eingeführt und tritt nun in vollen Effekt. PHP reagiert nun intelligenter bei der Arbeit mit mehreren Operatoren Als Beispiel wurde folgender Code angegeben:

echo "sum: " . $a + $b;

wurde von PHP bisher als

 echo ("sum: " . $a) + $b;

interpretiert. PHP 8 macht daraus jetzt

echo "sum: " . ($a + $b);

Reflection

Die 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 so geschrieben:

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

Um PHP 7 & PHP 8 gleichzeitig zu unterstützen, sollte man folgenderweise vorgehen:

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

Diese PHP-8-Features sind mittlerweile sicher. Bis zum endgültigen Release werden allerdings noch weitere Neuerungen erwartet.


Auf dem Laufenden bleiben?

Jetzt für unseren Newsletter anmelden und gratis Online-Marketing Whitepaper für lokale Anbieter sichern!