Was ist neu in PHP 8.1?

0
157

PHP 8.1 wurde im November 2021 als neueste Nebenversion von PHP veröffentlicht Sprache. Es fügt neben einigen kleineren Verbesserungen und Leistungsverbesserungen mehrere neue Sprachfunktionen hinzu. Es gibt einige wichtige Änderungen, die Sie beachten sollten, aber die meisten Upgrades von PHP 8.0 sollten unkompliziert sein.

Neue Funktionen

Das diesjährige PHP update fügt mehrere neue Funktionen hinzu, um die Entwicklerproduktivität zu verbessern. Folgendes können Sie nach dem Upgrade verwenden.

Aufzählungen

Aufzählungstypen sind endlich Teil der PHP-Sprache. Mit ihnen können Sie angeben, dass ein Wert einer aus einer Reihe vordefinierter Konstanten sein muss.

Im Vergleich zu regulären Konstanten bieten Aufzählungen eine integrierte Validierung, wenn sie als Methodenparameter und Rückgabewerte verwendet werden. Sie können auch unterstützende Werte und Methoden haben, die zusätzliches Verhalten anhängen.

# PHP 8.0-Klasse PostStatus { const Entwurf = 1; const Veröffentlicht = 2; }   # PHP 8.0 – Kann nicht tippen, dass der Wert # von `$PostStatus` # innerhalb von `PostStatus` definiert werden muss. Klasse Beitrag { öffentliche Funktion __construct( public string $Headline, public int $PostStatus) {} }   # PHP 8.1-Aufzählung PostStatus { Fall Entwurf = 1; Fall veröffentlicht = 2; }   # PHP 8.1 – Jetzt ist es unmöglich, einen # ungültigen Wert als Status zu übergeben. Klasse Beitrag { öffentliche Funktion __construct( öffentlicher String $Headline, öffentlicher PostStatus $PostStatus) {} }

Readonly-Eigenschaften

Das neue readonly-Schlüsselwort markiert eine Klasseneigenschaft als unveränderlich. Readonly-Eigenschaften können nur einmal beschrieben werden. Wenn Sie versuchen, ihren Wert nach der Initialisierung zu ändern, wird ein Fehler ausgegeben.

Werbung

Dies vereinfacht die Erstellung einfacher unveränderlicher Wertobjekte. Zuvor mussten Sie einer Klasse sich wiederholende Methoden hinzufügen, wenn Sie Eigenschaftswerte verfügbar machen wollten, ohne Änderungen zuzulassen. Jetzt können Sie die Eigenschaften öffentlich machen, ohne unbeabsichtigte Mutationen zu riskieren.

# PHP 8.0 – Das wird schnell repetitiv! Klasse Beitrag { öffentliche Funktion __construct( geschützte Zeichenfolge $Headline) {}   öffentliche Funktion getHeadline() : Zeichenfolge { Rückgabe $this -> Überschrift; } }   # PHP 8.1 Klasse Beitrag { öffentliche Funktion __construct( öffentlicher schreibgeschützter String $Headline) {} }

Kreuzungstypen

Das PHP-Typsystem versteht jetzt Kreuzungen. Damit können Sie angeben, dass ein Wert mehrere Schnittstellen implementieren muss.

Dies ist in Fällen nützlich, in denen Code Instanzmethoden aufrufen muss, die von zwei verschiedenen Schnittstellen definiert werden. Bisher mussten Sie eine neue Schnittstelle erstellen, die die beiden gewünschten erweitert. Dies war nicht immer praktisch, wenn Sie die Zielklasse nicht ändern konnten, um Ihre neue Schnittstelle zu implementieren.

Schnittpunkte werden durch die Kombination von zwei oder mehr Typen mit einem kaufmännischen Und-Zeichen definiert. Sie verleihen dem Typsystem nach der Einführung von Union-Typen in PHP 8.0 mehr Flexibilität. Eine Einschränkung besteht darin, dass Sie derzeit Schnitt- und Vereinigungstypen nicht zusammen verwenden können – Countable&Stringable|CustomType ist in dieser Version nicht zulässig.

# PHP 8.0-Schnittstelle CountableString erweitert Countable, Stringable {}   öffentliche Funktion countAndReport(CountableString $value) : nichtig { echo "$Wert: " . count($value); }   # PHP 8.1 öffentliche Funktion countAndReport(Countable&Stringable $value) : nichtig { echo "$Wert: " . count($value); }

Fasern

Fasern sind Mechanismen, um die gleichzeitige Ausführung zu erleichtern. Sie machen es einfacher, wiederaufsetzbare Codeblöcke zu implementieren, die von überall im Stack ausgesetzt werden können.

Die Fibers-API ist relativ niedrig. Es wird nicht erwartet, dass Endbenutzerentwickler regelmäßig damit interagieren. Stattdessen werden Fibers in Bibliotheken integriert, die asynchrone APIs und Event-Loop-Implementierungen bieten. Sie sind ein Kontrollflusssystem, das vereinfachte Abstraktionen auf höherer Ebene ermöglicht.

Werbung

Glasfasern bieten einen Pfad zu asynchronen Funktionsaufrufen, die wie reguläre synchrone Operationen aussehen. Sie können den mit Versprechen und Rückrufen verbundenen Boilerplate ausschneiden. Fibers handhaben das Aussetzen und Fortsetzen des Codes an den entsprechenden Stellen und bieten eine API für blockierende und nicht blockierende Implementierungen von Operationen.

# PHP 8.0 – Ein auf Versprechen basierender HTTP-Client $response = $httpClient -> Anfrage("http://example.com") -> dann(Funktion (Antwort $Antwort) { return $Antwort -> getBody(); }); drucke $antwort;   # PHP 8.1 – Ein HTTP-Client, der intern Fibers verwendet $response = $httpClient -> Anfrage("https://example.com"); $antwort drucken -> getBody();

First-Class-Callables

Callables sind jetzt erstklassige Bürger in der PHP-Sprache. Das bedeutet, dass Sie Variablen direkt Funktionen zuweisen können, ohne die alte Array-Syntax oder explizite Closure-Erstellung zu verwenden.

Diese Änderung wird in funktionalen Programmierkontexten am nützlichsten sein. Die Weitergabe von Funktionen ist mit direkter Variablenzuweisung sauberer und einfacher.

# PHP 8.0 $builtin = Closure::fromCallable("array_filter"); $method = [$this, "getData"];   # PHP 8.1 $eingebaut = array_filter(…); $methode = $dies -> getData(…);

Das … Ersetzen der Parameter der Funktion ist ein obligatorischer Bestandteil der Syntax. Dies signalisiert, dass Sie die Funktion der Variablen zuweisen möchten, anstatt die Funktion aufzurufen und ihren Rückgabewert zuzuweisen.

Verwenden von New In Initializers

Eine weitere neue Funktion ist das neue Schlüsselwort in Initializern. Sie können jetzt Objektinstanzen als Standardparameterwerte verwenden:

# PHP 8.0-Klasse SendNewsletterAction { geschützter Mailer $Mailer; öffentliche Funktion __construct(?Mailer $Mailer=null) { $dies -> Mailer = $Mailer ?? neuer SMTPMailer(); } }   # PHP 8.1-Klasse SendNewsletterAction { öffentliche Funktion __construct( protected readonly Mailer $Mailer=new SmtpMailer()) {} } Werbung

Das neue Schlüsselwort funktioniert auch mit statischen Variablen, globalen Konstanten und Attributargumenten. Es bietet Ihnen mehr Flexibilität und Komfort, wenn Sie eine Objektinstanz als Standardwert verwenden möchten.

Endgültige Klassenkonstanten

Das Schlüsselwort final wird jetzt für Klassenkonstanten unterstützt. Sie können einzelne Konstanten als endgültig markieren, ohne die gesamte Klasse zu versiegeln. Zuvor war es untergeordneten Klassen freigestellt, den Wert von Konstanten zu überschreiben, die von den Eltern geerbt wurden.

# PHP 8.0 – Kann dies nicht verbieten, ohne # die gesamte Klasse `final` zu machen Klasse DemoClass { public const DemoConstant = 1; } Klasse ChildClass erweitert DemoClass { public const DemoConstant = 2; }   # PHP 8.1 – Nur die Konstante kann `final` sein. Klasse DemoClass { finale öffentliche const DemoConstant = 1; } Klasse ChildClass erweitert DemoClass { //Löst einen schwerwiegenden Fehler aus public const DemoConstant = 2; }

Andere

Neben den oben aufgeführten Big Ticket-Elementen fügt PHP 8.1 auch einige praktische Funktionen hinzu, die dazu beitragen, dass der Code selbstdokumentierender wird. Sie können Oktalzahlen mit einer expliziten Notation schreiben, z. B. 0o14, und den neuen Nie-Return-Typ verwenden, um Funktionen zu kennzeichnen, die eine Ausnahme auslösen oder das aktuelle Skript beenden. Dies hilft bei der Erkennung von totem Code in statischer Analysesoftware.

In der Standardbibliothek gibt es einige neue Funktionen. array_is_list() lässt Sie prüfen, ob ein Array eine Liste (“foo”, “bar”]) oder assoziativ (“[“foo” => “bar”]) ist und bietet eine eingebaute Implementierung für eine Funktion, die 8217;s häufig im vorhandenen Userland-Code gefunden. Mit fsync() und fdatasync() können Sie Dateizeigeränderungen zurück auf das zugrunde liegende Speichermedium synchronisieren. Natriumunterstützung für die Hashing-Algorithmen XChaCha20 und Ristretto255 wurde ebenfalls hinzugefügt.

Schließlich bringt diese Version die Aussicht auf Leistungsverbesserungen. Optimierungen einschließlich eines Klassenvererbungs-Cache könnten eine kostenlose Leistungssteigerung von bis zu 8 % liefern. Dies würde am deutlichsten in stark objektorientierten Codebasen mit vielen Eltern-Kind-Beziehungen auffallen. PHP wird diese Links jetzt zwischenspeichern, damit sie nicht ständig neu erstellt werden.

Rückwärts inkompatible Änderungen

Als kleinere Versionsverbesserung gibt es einige wichtige Änderungen und veraltete Versionen, die Sie vor dem Upgrade beachten sollten. Hier sind die wahrscheinlichsten Probleme in Ihrer Codebasis:

  • Das Überschreiben des $_GLOBALS-Arrays ist nicht mehr erlaubt. Sie können weiterhin auf einzelne Schlüssel schreiben, aber $_GLOBALS selbst nicht neu zuweisen.
  • Wenn Sie eine integrierte Klasse erweitern, müssen Ihre überschriebenen Methoden einen Rückgabetyp deklarieren, der mit dem ursprünglichen kompatibel ist. Eine veraltete Warnung wird ausgegeben, wenn Sie einen inkompatiblen Typ angeben. Ein #[ReturnTypeWillChange]-Attribut wird derzeit unterstützt, um dies für Bibliotheken zu vermeiden, die mehrere PHP-Versionen unterstützen müssen.
  • Das Übergeben von Null an nicht-nullfähige Parameter interner Funktionen ist veraltet. Dies war zuvor zulässig, war jedoch nicht mit der Typhint-Erzwingung für benutzererstellte Funktionen vereinbar.
  • Implizite Umwandlungen von int in float sind veraltet – dies betrifft Szenarien wie $array[10.1], in denen die Mantisse verloren geht, da Arrays Integer-Schlüssel haben müssen.
  • Als Teil der laufenden Arbeit von PHP, Ressourcentypen zu entfernen, arbeiten mehrere Funktionsgruppen jetzt mit neuen Objekten anstelle von Ressourcen. Diese Änderungen gelten für die FileInfo-, FTP-, IMAP-, LDAP-, PgSQL- und PSpell-APIs.
  • Funktionen, die mit HTML-Entitäten wie htmlspecialchars() und htmlentities() arbeiten, umgehen jetzt standardmäßig Apostrophe, sodass ' zu . wird '.
  • Das direkte Aufrufen statischer Methoden für Merkmale ist veraltet; Sie sollten die Methode für eine Klasse aufrufen, die stattdessen das Merkmal verwendet.

Andere Entfernungen und Einstellungen betreffen einzelne APIs, einschließlich PDO, MySQLi und Standard. Sie sollten den gesamten Migrationsleitfaden lesen, bevor Sie Ihr Projekt aktualisieren.

Werbung

Zusammengenommen sind die Änderungen dieses Zyklus ziemlich harmlos. Codebasen, die bereits den modernen PHP-Best Practices entsprechen, sollten beim Umstieg auf 8.1 nicht zu viele Probleme haben. Beliebte Frameworks wie Symfony und Laravel unterstützen auch bereits PHP 8.1.

Schlussfolgerung

PHP 8.1 fügt viele neue Funktionen hinzu, die die Entwicklung einfacher und optimierter machen. Enums waren lange Zeit ein fehlender Teil des Typsystems, während schreibgeschützte Eigenschaften und neue Initialisierer das Schreiben neuer Klassen beschleunigen.

Fasern helfen dabei, asynchrones PHP zugänglicher zu machen, während erstklassige Callables optimierte Funktionen ermöglichen Referenzen beim Üben funktionaler Programmiertechniken. All diese Änderungen reifen PHP als flexible Sprache weiter, die starke Sicherheitsgarantien für Ihren Code bietet und gleichzeitig einfach zu handhaben ist.