
PHP 8 - Was ist neu?
Die Veröffentlichung von PHP 8 ist schon seit einiger Zeit im Internet ein Thema, und obwohl es noch fast zwei Monate dauert, wissen wir bereits, was neu ist und welche der Änderungen den nahtlosen Wechsel von PHP 7 zur aktuellen Version wirklich erschweren können
Kürzlich wurde die letzte von vier geplanten Beta-Versionen veröffentlicht – das bedeutet, dass bis zum geplanten Veröffentlichungstermin am 26. November 2020 noch vier Release Candidate-Versionen folgen werden
In unserer Agentur, in der wir täglich Drupal-Dienstleistungen sowie Drupal-Support anbieten und in unserem Team viele PHP-Entwickler haben, beobachten wir alle Neuigkeiten genau und präsentieren daher im folgenden Text die wichtigsten Änderungen, die mit Version 8 eingeführt werden
Union-Typen
Es ist ein Zugeständnis an die statische Typisierung, während die dynamische Natur der Sprache erhalten bleibt. Die Union erlaubt es, eine Menge von Typen (zwei oder mehr) sowohl für Eingabedaten als auch für Ausgabedaten zu definieren. Bisher erlaubte die Syntax der Sprache nicht die Verwendung der Union, und dieses Problem wurde durch die Definition von Typen in Anmerkungen umgangen
class Example {
private int|string $id;
public function setId(int|string $id): void {
$this->id = $id;
}
public function getId(): int|string {
return $this->id;
}
}
Die Definition eines void-Typs unter den zurückgegebenen Typen ist unzulässig, da dieser Typ bereits angibt, dass die Funktion keinen Wert zurückgibt. Wir können jedoch problemlos null definieren, um sogenannte nullable Werte zu kennzeichnen
Benannte Argumente
Dies ist ein Problem, dem viele PHP-Programmierer in ihrer Entwicklungsarbeit begegnet sind, die oft Methoden oder Funktionen verwenden mussten, die viele optionale Argumente besitzen, von denen viele Standardwerte haben. Bis jetzt hatten sie keine andere Wahl, als alle vorhergehenden Standardwerte in der gleichen Reihenfolge zu kopieren, um einem der Argumente ihren eigenen Wert zuzuweisen. Benannte Argumente erlauben die Übergabe eines Parameters basierend auf seinem Namen anstelle der Reihenfolge
foo(string $b, ?string $a, ?string $r): {
}
Example::foo(
b: 'Foo',
r: 'Bar',
);
Konstruktor-Property-Promotion
Wenn Sie das Zuweisen mehrerer Argumente im Konstruktor an die Objekteigenschaften den Schlaf gekostet hat, können Sie beruhigt sein – in PHP 8 wird dies nie wieder passieren. Obwohl dies kaum mehr als syntaktischer Zucker ist, wird dieses Feature sicherlich die Klarheit vieler Klassen in Ihrer Anwendung erhöhen. Unten finden Sie einen Vergleich von Konstruktoren in PHP 7 und PHP 8.
// PHP 7
class Example {
public Foo $foo;
protected Bar $bar;
public function __construct(
Foo $foo,
Bar $bar
) {
$this->foo = $foo;
$this->bar = $bar;
}
}
// PHP 8
class Example {
public function __construct(
public Foo $foo,
protected Bar $bar,
) {}
}
Attribute
Einige kennen sie als Anmerkungen, die bisher nur in Form von Kommentaren erstellt wurden (gelesen von speziellen Bibliotheken wie Doctrine ORM) — schließlich wurden sie zu einem tatsächlichen und offiziellen Teil der Sprache befördert. Nach einem heftigen Streit darüber, wie Anmerkungen gekennzeichnet werden sollten, wurde das doppelte Größer-als-Zeichen als Eröffnung und das Kleiner-als-Zeichen als Schließen des Attributs gewählt.
use Php\Attributes\Deprecated;
<<Deprecated("Verwenden Sie stattdessen bar()")>>
function foo() {}
Match-Ausdruck
Obwohl der Name dieser neuen Funktionalität eine gewisse Verbindung zu regulären Ausdrücken nahelegen könnte, ist sie eher dem switch-Befehl ähnlich. Dank dieses Mechanismus können Entwickler den Wert basierend auf dem Eingabeparameter zurückgeben, ohne zusätzliche Schlüsselwörter wie break oder return zu verwenden. Außerdem verwendet Match eine starke Typisierung, um Werte zu vergleichen (ähnlich wie beim === Vergleichsausdruck), und wenn keiner der Fälle erfüllt ist, wird standardmäßig die UnhandeledMatchError-Ausnahme ausgelöst.
$controller = match ($status_code) {
200 => new PageController(),
301, 302, 303 => new RedirectController(),
404 => new PageNotFoundController(),
};
JIT (Just in time compiler)
Der Mechanismus, der seit PHP 7.4 zum Testen zur Verfügung steht, hat endlich seine offizielle Veröffentlichung erhalten. JIT ist nichts anderes als das Kompilieren in Maschinencode unmittelbar vor der Ausführung. In der Praxis ermöglicht dies, den Anwendungscode „on the fly“ auszuführen, schneller als mit einem herkömmlichen Interpreter. Dies kann verglichen werden mit dem Cachen von bereits interpretiertem Code.
Für diejenigen, die Hack und HHVM (HipHop Virtual Machine) kennen, die von den Entwicklern von facebook.com erstellt wurden, ist JIT kaum etwas Bemerkenswertes. In der PHP-Welt versuchten die Entwickler vor der Veröffentlichung von PHP 8 weiterhin, die Leistung mit allen verfügbaren Mitteln ohne den Einsatz von JIT zu verbessern. Das Fehlen tatsächlicher Verbesserungsmöglichkeiten zwang sie, den Fußstapfen unserer Facebook-Kollegen zu folgen.
Um mehr über Jit zu erfahren, lesen Sie meinen Jit in PHP Artikel.
Andere neue Funktionen
Zu den Neuerungen, die PHP 8 uns bieten wird, finden wir noch einige weitere kleine Funktionen, die auch für neue Unternehmen interessant sein könnten - PHP wird als die perfekte Lösung für Startups angesehen.
- nullsicherer Operator - Äquivalent des null coalescing Operators für Methoden, z.B. $item->getField()?->getValue();
- static - als zurückgegebenen Wertetyp hinzugefügt, zuvor war nur self verfügbar;
- mixed - ein neuer Wertetyp, der dasselbe bedeutet wie der bekannte mixed Wert in den Kommentaren, was jeden einfachen Typ bedeutet;
- WeakMaps - ein Mechanismus zum Speichern von Referenzen, der gleichzeitig deren Entfernung durch den Garbage Collector ermöglicht;
- Verwendung der magischen ::class Methode bei Objekten – ermöglicht es, denselben Wert zu erhalten wie von der get_class() Funktion zurückgegeben;
- nachgestelltes Komma in der Liste der Funktionsparameter;
- Umgang mit Ausnahmen, ohne dass diese einer Variablen zugewiesen werden müssen;
- neues Stringable Interface – wird automatisch allen Klassen zugewiesen, die die __toString() Methode implementieren;
- Validierung von abstrakten Methoden, die von traits abgeleitet sind.
Neue Funktionen
Zusätzlich zu den bisher erwähnten Änderungen in der Sprachsyntax bringt die Veröffentlichung von PHP 8 eine Reihe nützlicher neuer Funktionen mit sich, die – ehrlich gesagt – größtenteils die sogenannte syntaktische Zucker sind, gleichzeitig aber den Komfort der täglichen Arbeit mit der Sprache erheblich erhöhen. Die wichtigsten davon sind:
str_contains()
Da jeder überprüfen musste, ob ein gegebener String eine bestimmte Teilphrase enthält, indem die strpos-Funktion verwendet wird und ob der zurückgegebene Wert ungleich FALSE war. Die str_contains-Funktion kann diese Überprüfung im Hintergrund durchführen.
str_starts_with() und str_ends_with()
Beide Funktionen tun genau das, was der Name sagt – sie prüfen, ob ein String mit einem bestimmten Wert beginnt oder endet.
get_debug_type()
Diese Funktion erweitert die gettype()-Funktion – außer dass sie den genauen Typ, wie er im Code definiert ist, zurückgibt, zum Beispiel int statt integer, float statt double, oder \Foo\Bar statt object.
Allgemeine Änderungen
Da es sich um eine neue Hauptversion handelt, werden auch einige Änderungen an den bestehenden Sprachelementen eingeführt. In PHP 8 sehen wir einen klaren Schritt in Richtung Klarheit und Transparenz, sodass sie vorhersagbarer sind und keine unnötigen Verwirrungen verursachen.
Wichtige Änderungen umfassen die Rückgabe von TypeError- und ValueError-Ausnahmen für interne Funktionen. Die Mechanismen zur Variablenvergleiche von verschiedenen Arten, die Reihenfolge der Verkettung oder die Verifizierung von Typen bei arithmetischen und Bitoperationen wurden verbessert. Die Fähigkeit, nicht-statische Methoden statisch aufzurufen, wurde entfernt.
Zudem wurden Funktionen wie create_function() und each() entfernt, während Mechanismen anderer Funktionen, einschließlich array_key_exists() und define(), geändert wurden.
Wichtige Änderungen wurden auch an den Standardmechanismen für Fehlerbehandlung und -anzeige vorgenommen. Der Standardwert für die Fehlerberichterstattung wird E_ALL sein, und der @-Operator wird keine kritischen Fehler mehr maskieren.
Schlussfolgerungen
Die neue Version von PHP 8 ist ein sicherer Schritt in Richtung Aufräumen der Sprache und ein Release, das viele lang ersehnte Funktionen mit sich bringt.
In diesem Artikel habe ich die wichtigsten Änderungen zusammengefasst, was wir erwarten können und was im Kontext der Implementierung von PHP-Entwicklungs-diensten wichtig sein könnte. Allerdings möchte ich definitiv mehr Licht auf den JIT-Compiler werfen, der in einem separaten Artikel auf unserem Blog vorgestellt wird.