Veröffentlichung der Programmiersprache PHP 8.1

Nach einem Jahr Entwicklungszeit wurde die Veröffentlichung der Programmiersprache PHP 8.1 vorgestellt. Der neue Zweig enthält eine Reihe neuer Funktionen sowie mehrere Änderungen, die die Kompatibilität beeinträchtigen.

Wichtige Verbesserungen in PHP 8.1:

  • Unterstützung für Aufzählungen hinzugefügt. Sie können jetzt beispielsweise die folgenden Konstrukte verwenden: enum Status { case Pending; Fall Aktiv; Fall archiviert; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Unterstützung für leichtgewichtige Threads namens Fibers hinzugefügt, mit denen Sie Ausführungsthreads auf einer niedrigen Ebene verwalten können. Es ist geplant, den Amphp- und ReactPHP-Frameworks Glasfaserunterstützung hinzuzufügen. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('after suspending'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('after resuming');
  • Die Implementierung des Objektcode-Cache (opcache) wurde verbessert, sodass Informationen zur Klassenvererbung zwischengespeichert werden können. Durch die Optimierung konnte die Leistung einiger Anwendungen um 5-8 % gesteigert werden. Weitere Optimierungen umfassen die Optimierung des JIT-Betriebs, die Implementierung der JIT-Unterstützung für die ARM64-Architektur (AArch64), die Beschleunigung der Namensauflösung, die Optimierung von Timelib- und Ext/Date-Bibliotheken, eine erhöhte Serialisierungs- und Deserialisierungsleistung, die Optimierung von get_declared_classes(), explosion() , strtr()-Funktion, strnatcmp(), dechex(). Im Allgemeinen gibt es eine Leistungssteigerung von 23.0 % für Symfony Demo und 3.5 % für WordPress.
  • Der Entpackoperator innerhalb von Arrays „...$var“, der das Ersetzen vorhandener Arrays beim Definieren eines neuen Arrays ermöglicht, wurde um die Unterstützung von Zeichenfolgenschlüsseln erweitert (zuvor wurden nur digitale Bezeichner unterstützt). Beispielsweise können Sie jetzt im Code Folgendes verwenden: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [„a“ => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Es ist erlaubt, das Schlüsselwort „new“ in Initialisierern zu verwenden, beispielsweise in Funktionsdefinitionen als Standardparameter oder in Argumentattributen. Klasse MyController { öffentliche Funktion __construct( private Logger $logger = new NullLogger(), ) {} }
  • Es ist möglich, Klasseneigenschaften für den schreibgeschützten Zugriff zu markieren (Informationen in solchen Eigenschaften können nur einmal geschrieben werden, danach sind sie nicht mehr für Änderungen verfügbar). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Andere'; > Fehler: Die schreibgeschützte Eigenschaft Post::$title kann nicht geändert werden
  • Für aufrufbare Objekte wurde eine neue Syntax implementiert – ein Abschluss kann nun gebildet werden, indem eine Funktion aufgerufen und ihr der Wert „…“ als Argument übergeben wird (d. h. myFunc(...) anstelle von Closure::fromCallable('myFunc). ')): function foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Vollständige Unterstützung für Schnittpunkttypen hinzugefügt, sodass Sie neue Typen erstellen können, indem Sie vorhandene kombinieren. Im Gegensatz zu Union-Typen, die Sammlungen von zwei oder mehr Typen definieren, erfordern Schnittmengentypen nicht das Vorhandensein eines der aufgelisteten Typen, sondern aller angegebenen Typen in der Menge, die gefüllt werden soll. function genericSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Es gibt einen neuen Typ „never“, mit dem statische Analysatoren darüber informiert werden können, dass eine Funktion die Programmausführung beendet, beispielsweise durch Auslösen einer Ausnahme oder Ausführen der Exit-Funktion. Funktion dd(mixed $input): never { exit; }
  • Es wurde eine neue Funktion array_is_list vorgeschlagen, mit der Sie bestimmen können, dass die Schlüssel im Array in der Reihenfolge aufsteigender numerischer Werte angeordnet sind, beginnend bei 0: $list = [„a“, „b“, „c“]; array_is_list($list); // true $notAList = [1 => „a“, 2 => „b“, 3 => „c“]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // FALSCH
  • Sie können jetzt das Schlüsselwort „final“ verwenden, um zu verhindern, dass übergeordnete Klassenkonstanten überschrieben werden. Klasse Foo { final public const X = "foo"; } class Bar erweitert Foo { public const X = "bar"; > Schwerwiegender Fehler: Bar::X kann die endgültige Konstante Foo::X nicht überschreiben.}
  • Die Funktionen fsync und fdatasync werden vorgeschlagen, um das Speichern von Änderungen aus dem Festplatten-Cache zu erzwingen. $file = fopen("sample.txt", "w"); fwrite($file, "Einige Inhalte"); if (fsync($file)) { echo „Datei wurde erfolgreich auf der Festplatte gespeichert.“; } fclose($file);
  • Es wurde die Möglichkeit hinzugefügt, zusätzlich zum zuvor verwendeten Präfix „0“ die Präfixe „0o“ und „0O“ für Oktalzahlen zu verwenden. 016 === 0o16; // wahr 016 === 0O16; // WAHR
  • Es wird vorgeschlagen, die Verwendung von $GLOBALS selektiv einzuschränken, was zu einer Verletzung der Abwärtskompatibilität führt, aber eine deutliche Beschleunigung von Operationen mit Arrays ermöglicht. Beispielsweise wird die Möglichkeit in Betracht gezogen, das Schreiben auf $GLOBALS zu deaktivieren und $GLOBALS per Zeiger zu übergeben. Eine Analyse von 2000 Paketen ergab, dass nur 23 davon von dieser Änderung betroffen wären. Wenn der Vorschlag beispielsweise genehmigt wird, unterstützt 8.1 keine Ausdrücke mehr wie: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Interne Methoden sollten jetzt den richtigen Typ zurückgeben. In PHP 8.1 führt die Rückgabe eines Typs, der nicht mit der Funktionsdeklaration übereinstimmt, zu einer Warnung, in PHP 9.0 wird die Warnung jedoch durch einen Fehler ersetzt.
  • Die Arbeit an der Übertragung von Funktionen von der Nutzung von Ressourcen auf die Manipulation von Objekten wurde fortgesetzt. Die Funktionen finfo_* und imap_* wurden auf Objekte übertragen.
  • Die Übergabe von Nullwerten als Argumente an interne Funktionen, die als nicht nullbar gekennzeichnet sind, ist veraltet. In PHP 8.1 führt die Verwendung von Konstrukten wie str_contains("string", null) zu einer Warnung und in PHP 9 zu einem Fehler.
  • Unterstützung für MurmurHash3- und xxHash-Hashing-Algorithmen hinzugefügt.

Source: opennet.ru

Kommentar hinzufügen