PHP 8: Was bringt die nächste Major-Version Neues?

← zurück zum Blog

Im Juni 2020 wird PHP 25 Jahre alt. Am 08.06.1995 präsentierte PHP-Erfinder Rasmus Lerdorf erstmals seine «Personal Home Page Tools (PHP Tools)» in einer Newsgroup. 2020 markiert aber nicht nur das 25-jährige Jubiläum, sondern wird auch für die nächste Major-Version der beliebten Skriptsprache sorgen.

PHP 8: Was bringt die nächste Major-Version Neues?

Bis Ende Juli 2020 wird noch kräftig an neuen Funktionen gebaut, Anfang Dezember soll dann die erste stabile Version von PHP 8.0 erscheinen. Wir stellen neue Features von PHP 8 vor, die wir besonders interessant finden.

Killerfeature JIT?

Als absoluter Star unter den Neuerungen von PHP 8 gilt die Einführung von JIT. JIT steht für «Just-in-Time». Genauer ist damit der sogenannte Just-in-Time-Compiler gemeint. Just-in-Time-Compiler? Wir erklären’s.

Ein JIT-Compiler kommt höchstwahrscheinlich gerade jetzt zum Einsatz, wenn Du diesen Beitrag liest. JIT-Compiler sind nämlich in allen gängigen Browsern eingebaut, um die Ausführungsgeschwindigkeit von JavaScript zu erhöhen. Was für schnelle JavaScript-Ausführung sorgt, wird es ab Dezember 2020 damit auch in PHP geben.

Bisher: Übersetzer und Caching

PHP ist eine Skriptsprache, wird also von einem Interpreter in maschinenlesbaren Code übersetzt, damit der Server die Anweisungen umsetzen kann. Das geschieht in den meisten Fällen Zeile für Zeile, während eine PHP-Datei aufgerufen wird. Und weil PHP quasi bei jedem neuen Aufruf einer Datei bei Null anfängt, ist das ziemlich zeitaufwendig.

Damit immer wieder gleiche Aufrufe nicht jedes Mal neu berechnet werden müssen, gibt es seit einigen Versionen den OPCache. OPCache legt häufig aufgerufene Code-Teile als sogenannten OPCode (in anderen Sprachen als Bytecode bekannt) im Zwischenspeicher ab, den die Zend-VM danach direkt in Maschinencode umwandelt, der wiederum von der CPU (Prozessor) ausgeführt wird.

Neu: Heisser Code, direkt kompiliert

Im Gegensatz zu Skriptsprachen wie PHP oder JavaScript stehen Sprachen wie Java, C oder Rust. In diesen Sprachen wird der Programmcode komplett kompiliert, also in Maschinencode übersetzt, bevor das entsprechende Programm ausgeführt werden kann. Würde das bei PHP ebenfalls passieren, müsste am Beispiel einer Website bei jeder Änderung die komplette Website neu kompiliert werden.

In den meisten Fällen ist das natürlich nicht sinnvoll, weil damit die Dynamik der Scriptsprache verloren geht. Und hier setzt JIT an: Der JIT-Compiler prüft konstant, welche Programmteile ausgeführt werden. Erkennt der Compiler Stellen, die immer wieder ausgeführt werden und sich dabei nicht verändern, markiert er diese als «heiss» und legt sie als Maschinencode ab. Bei der nächsten Ausführung muss der Code damit nicht mehr interpretiert werden, was einen enormen Geschwindigkeitsgewinn bringt.

Doch Achtung: Im Vergleich zu PHP 7.4 sind mit PHP 8.0 und JIT bei Web-Applikationen keine Quantensprünge zu erwarten. Dazu sind bei den meisten Web-Applikationen die rechenintensiven Operationen schlichtweg vernachlässigbar klein.

Hingegen macht JIT PHP neu auch für Anwendungen attraktiv, für welche die Entwicklergemeinde die Sprache bisher links liegen liess: Machine-Learning, Grafik-Rendering oder Datenanalyse, um nur einige zu nennen. Nicht zuletzt legt JIT auch die Basis für PHP-Erweiterungen, die selbst in PHP geschrieben sind. Bisher musste man dazu auf C als Programmiersprache zurückgreifen, um performante Erweiterungen zu schreiben. Das PHP-Ökosystem werden diese Neuerungen bestimmt weiterbringen.

Kontrovers: Attributes

Eine der Neuerungen, die für kontroverse Diskussionen in der PHP-Community gesorgt hat, sind Attributes. In vielen anderen Sprachen als Annotations bekannt, machen es Attributes möglich, Meta-Daten in einer strukturierten Form mitzugeben. Bis anhin musstest Du dir mit Docblocks behelfen, um Meta-Daten zu hinterlegen. Dass Attributes eine gute Sache sind, darüber ist sich die PHP-Community einig. Für Kontroversen hat viel mehr die Wahl der Syntax gesorgt, an die sich mit der Zeit aber auch die Kritiker gewöhnen werden (müssen).

<<ExampleAttribute>>
class Foo
{
    <<ExampleAttribute>>
    public const FOO = 'foo';
 
    <<ExampleAttribute>>
    public $x;
 
    <<ExampleAttribute>>
    public function foo(<<ExampleAttribute>> $bar) { }
}

Constructor property promotion

Mit PHP 8 kannst Du die Klassendefinition und den Konstruktor für Wert- oder Datentransferobjekte nun auch kombinieren. Anstatt:

class Money 
{
    public Currency $currency;
 
    public int $amount;
 
    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}

kannst Du neu folgenden Code nutzen:

class Money 
{
    public function __construct(
        public Currency $currency,
        public int $amount,
    ) {}
}

Für die neue Syntax gibt es viele Variationen. Ein genauerer Blick auf den RFC lohnt sich: PHP RFC: Constructor Property Promotion

Neuer Return-Type: static

Bisher konntest Du self als Return-Type verwenden. Neu kannst Du z.B. bei einer Fabrikmethode korrekt static als Return-Type angeben. Das verleiht der Sprache noch ein kleines Stückchen mehr Typsicherheit.

class Test {
    public function createFromWhatever($whatever): static {
        return new static($whatever);
    }
}

::class auf Objekten

Eine kleine, aber feine Neuerung, wie wir finden: Mit PHP 8 kannst Du ::class auch auf Objekte anwenden, anstatt dafür get_class() nutzen zu müssen.

$object = new stdClass;
var_dump($object::class); // "stdClass"

Abschliessendes Komma in Parameterlisten

Abschliessende Kommas sind seit PHP 7.3 bereits für Methoden- und Funktionsaufrufe erlaubt. Mit PHP 8 ist nun auch in Parameterlisten dieses «Trailing Comma» valide. Fazit unseres Software-Engineering-Teams: 🎉

Vorher:

class Uri {
    private function __construct(
        ?string $scheme,
        ?string $user,
        ?string $pass,
        ?string $host,
        ?int $port,
        string $path,
        ?string $query,
        ?string $fragment // <-- 😠
    ) {
        ...
    }
}

Nachher:

class Uri {
    private function __construct(
        ?string $scheme,
        ?string $user,
        ?string $pass,
        ?string $host,
        ?int $port,
        string $path,
        ?string $query,
        ?string $fragment, // <-- 🎉
    ) {
        ...
    }
}

Neue Major-Version, einige Breaking Changes

PHP 8 ist eine neue Major-Version. Das bedeutet, dass einige Änderungen enthalten sind, die mit älterem Code nicht mehr kompatibel sind. Viele der Änderungen sind bereits seit einer der Minor-Versionen von PHP 7 als veraltet markiert, weshalb Du mit dem Wechsel auf PHP 8 generell keine Probleme haben solltest, wenn Du mit den Anpassungen in den vergangenen Versionen vertraut bist. Eine Liste mit allen Breaking Changes findest Du wie gehabt auf der Upgrade-Seite der PHP Group (zurzeit noch nicht auf php.net verfügbar).

Ganz viele neue Features

Neben den erwähnten neuen Funktionen wird PHP 8 noch eine ganze Menge an weiteren Neuerungen bieten. Im Blog des Entwicklers Brent Roose findest Du eine tolle Übersicht zu allen bereits feststehenden Änderungen in PHP 8.

Wie zu Beginn erwähnt, ist der «Feature Freeze» für Ende Juli 2020 geplant. Bis dahin wird bestimmt noch die eine oder andere neue Funktion hinzukommen, die es in die Version 8.0 schaffen wird. Wie zum Beispiel der ganz frische «Nullsafe Operator», über dessen Einzug in Version 8 die PHP Group in den nächsten Wochen abstimmen wird.

Ein Kommentar

  1. Bei der Attribute-Syntax gab es gerade einen Re-Vote, sieht so aus, als ob es nun doch `@@Attribute` sein wird.

Kommentar hinzufügen

Ihre E-Mail-Adresse wird nicht veröffentlicht.
Auszufüllende Felder sind mit einem * gekennzeichnet.

*
*
*
Einfache HTML Anweisungen wie a, strong, blockquote etc. sind möglich.

Hinweis

Wir behalten uns vor, Spam-, beleidigende oder anderweitig unpassende Kommentare zu entfernen.

← zurück zum Blog