PHP 8: Die neueste Major-Version ist da

Philipp Zeder
Autor:

Philipp Zeder

Kategorie:

in

Entwicklung & Performance

Veröffentlicht am 1. Dez. 2020

Aktualisiert am 7. März 2024

Im Juni 2020 wurde 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 markierte bisher aber nicht nur das 25-jährige Jubiläum, sondern hat nun auch für die neueste Major-Version der beliebten Skriptsprache gesorgt.

PHP 8: Die neueste Major-Version ist da

Wir stellen Dir die neuen 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, kannst Du jetzt auch mit PHP nutzen.

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 Entwickler*innengemeinde 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, die zudem nachträglich wegen Inkompatibilitäten nochmals geändert werden musste.

#[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.

Ganz viele neue Features

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

PHP 8.0 jetzt bei cyon verfügbar

Du kannst PHP 8.0 ab sofort auf Deinem Webhosting, Agencyserver oder Speedserver nutzen. Die neueste PHP-Version aktivierst Du, wie alle anderen verfügbaren PHP-Versionen, bequem in Deinem my.cyon-Konto. Eine Anleitung dazu findest Du in unserem Supportcenter: PHP-Versionsmanager

Beteilige dich an der Diskussion

8 Kommentare

Danilo
Danilo 27. Jan. 2021 17:50

Gibt es auch schon Planungen für ein Update von mysql? Der offizielle Support für die aktuell eingesetzte Version läuft ja glaube ich bald aus.

Philipp Zeder
Philipp Zeder cyon
28. Jan. 2021 09:34

Hey Danilo, die von uns verwendete MySQL-Version 5.7 wird offiziell noch bis Oktober 2023 supported. Wir haben das Thema MySQL-Update aber auf dem Radar.

Peter
Peter 9. Dez. 2020 12:39

Danke Cyon-Team

ich konnte PHP 8.0.0 mit folgenden Composer-Paketen testen:
“doctrine/orm”: “2.8.1”,
“gedmo/doctrine-extensions”: “v2.4.42”,
“endroid/qr-code”: “3.9.6”,
“mpdf/mpdf”: “v8.0.8”,
“jodit/connector”: “3.0.32”,

Ein Fehler tritt auf bei endroid/qr-code und jodit/connector

– imagecreatetruecolor() (GD Library) erzeugt keine Resource sondern ein Object, dies führt zu einem Fehler bei der Prüfung in PngWriter.php (endorid/qr-code) mittels is_resource($image).

– ein Upload eines Bildes führt bei jodit/connector zu einer Fehlermeldung das Bild wird jedoch hochgeladen.

Grüsse
Peter

Philipp Zeder
Philipp Zeder cyon
10. Dez. 2020 15:51

Merci fürs Testen, Peter. Viele Pakete sind noch nicht mit PHP 8 kompatibel, die Situation dürfte sich in den kommenden Wochen aber immer weiter verbessern.

Peter
Peter 3. Dez. 2020 05:17

Hallo Philipp

Vielen dank, ich habe es gerade ausprobiert.
Folgende 3 Probleme sind aufgetreten:

– die Funktion dechex() verlangt neu zwingend als Argument ein Integer, wird ein
String übergeben, dann wird eine Uncaught TypeError geworfen. Es gab unter
PHP 7.4 keine diesbezügliche Warnungen bzw. Notice

– Ein unlink($filename) scheitert mit der Warnung: Permission denied

– Ein copy($sourceFile, $targetFile) scheitert mit der Warnung: Permission denied

Könnt ihr mir bezüglich Permission denied weiter helfen ?

Grüsse
Peter

Philipp Zeder
Philipp Zeder cyon
3. Dez. 2020 09:36

Hallo Peter. Zurzeit ist die Auslieferung von Websites mit PHP 8.0 gestört, ich gehe davon aus, dass die Warnungen mit diesem Problem zusammenhängen. Wir halten Dich unter https://status.cyon.info/incident/473 auf dem Laufenden.

Roro
Roro 3. Dez. 2020 14:54

Schade, wollte gerade mit PHP8.0 ausprobieren. Naja kann man halt nichts machen. Aber es freut mich dass ihr Laravel in eurem Unternehmen verwendet :)

tobiv
tobiv 3. Juli 2020 20:25

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