PHP 8: Die neueste Major-Version ist da
Philipp Zeder
Kategorie:in
Entwicklung & Performance
Veröffentlicht am 1. Dez. 2020
Aktualisiert am 9. Sept. 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.
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
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.
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
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.
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
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.
Schade, wollte gerade mit PHP8.0 ausprobieren. Naja kann man halt nichts machen. Aber es freut mich dass ihr Laravel in eurem Unternehmen verwendet :)
Bei der Attribute-Syntax gab es gerade einen Re-Vote, sieht so aus, als ob es nun doch `@@Attribute` sein wird.
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.