Wydanie języka programowania PHP 8.1

Po roku prac zaprezentowano wydanie języka programowania PHP 8.1. Nowa gałąź zawiera szereg nowych funkcji, a także kilka zmian psujących kompatybilność.

Kluczowe ulepszenia w PHP 8.1:

  • Dodano obsługę wyliczeń, na przykład możesz teraz używać następujących konstrukcji: enum Status { sprawa w toku; obudowa Aktywna; sprawa Zarchiwizowana; } class Post { funkcja publiczna __construct( prywatny status $status = Status::Pending; ) {} funkcja publiczna setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Dodano obsługę lekkich wątków zwanych Fibres, które umożliwiają zarządzanie wątkami wykonawczymi na niskim poziomie. Planowane jest dodanie obsługi światłowodów do frameworków Amphp i ReactPHP. $włókno = nowe włókno(funkcja (): void { $valueAfterResuming = Fiber::suspend('po zawieszeniu'); // ... }); $valueAfterSuspending = $włókno->start(); $fiber->resume('po wznowieniu');
  • Poprawiono implementację pamięci podręcznej kodu obiektowego (opcache), umożliwiając buforowanie informacji o dziedziczeniu klas. Optymalizacja umożliwiła zwiększenie wydajności niektórych aplikacji o 5-8%. Inne optymalizacje obejmują optymalizację działania JIT, wdrożenie obsługi JIT dla architektury ARM64 (AArch64), przyspieszenie rozpoznawania nazw, optymalizację bibliotek timelib i ext/date, zwiększoną wydajność serializacji i deserializacji, optymalizację funkcji get_declared_classes(), eksplod() , funkcja strtr(), strnatcmp(), dechex(). Ogólnie rzecz biorąc, nastąpił wzrost wydajności o 23.0% w przypadku Symfony Demo i 3.5% w przypadku WordPress.
  • Operator rozpakowywania wewnątrz tablic "...$var", który umożliwia podstawianie istniejących tablic przy definiowaniu nowej tablicy, został rozszerzony o obsługę kluczy łańcuchowych (wcześniej obsługiwane były tylko identyfikatory cyfrowe). Na przykład możesz teraz użyć w kodzie: $array1 = [„a” => 1]; $tablica2 = ["b" => 2]; $tablica = [„a” => 0, …$tablica1, …$tablica2]; var_dump($tablica); // ["a" => 1, "b" => 2]
  • Dopuszczalne jest użycie słowa kluczowego „new” w inicjatorach, np. w definicjach funkcji jako parametru domyślnego lub w atrybutach argumentów. klasa MójKontroler { funkcja publiczna __construct( prywatny rejestrator $logger = nowy NullLogger(), ) {} }
  • Istnieje możliwość oznaczenia właściwości klasy jako dostępne tylko do odczytu (informacje w takich właściwościach można zapisać tylko raz, po czym nie będzie już możliwości ich zmiany). class PostData { funkcja publiczna __construct( publiczny ciąg tylko do odczytu $tytuł, publiczny tylko do odczytu DateTimeImmutable $data, ) {} } $post = nowy Post('Tytuł', /* … */); $post->title = 'Inne'; > Błąd: Nie można zmodyfikować właściwości tylko do odczytu Post::$title
  • Zaimplementowano nową składnię dla obiektów wywoływalnych - zamknięcie można teraz utworzyć wywołując funkcję i przekazując jej wartość "..." jako argument (tj. myFunc(...) zamiast Closure::fromCallable('myFunc ')): funkcja foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Dodano pełną obsługę typów skrzyżowań, umożliwiając tworzenie nowych typów poprzez łączenie istniejących. W przeciwieństwie do typów unii, które definiują kolekcje dwóch lub więcej typów, typy skrzyżowania wymagają obecności nie żadnego z wymienionych typów, ale wszystkich określonych typów w zestawie do wypełnienia. funkcja generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Dostępny jest nowy typ „nigdy”, którego można użyć do poinformowania analizatorów statycznych, że funkcja zakończy wykonywanie programu, na przykład poprzez zgłoszenie wyjątku lub wykonanie funkcji wyjścia. funkcja dd(mieszane $wejście): nigdy { wyjście; }
  • Zaproponowano nową funkcję array_is_list, która pozwala określić, czy klucze w tablicy są ułożone w kolejności rosnącej wartości liczbowej, zaczynając od 0: $list = [„a”, „b”, „c”]; array_is_list($lista); // true $notAList = [1 => „a”, 2 => „b”, 3 => „c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // FAŁSZ
  • Możesz teraz użyć słowa kluczowego „final”, aby zapobiec zastępowaniu stałych klasy nadrzędnej. klasa Foo { ostateczna stała publiczna X = "foo"; } klasa Bar rozszerza Foo { public const X = "bar"; > Błąd krytyczny: Bar::X nie może zastąpić końcowej stałej Foo::X }
  • Zaproponowano funkcje fsync i fdatasync, aby wymusić zapisanie zmian z pamięci podręcznej dysku. $plik = fopen("przykład.txt", "w"); fwrite($plik, "Jakaś treść"); if (fsync($file)) { echo "Plik został pomyślnie utrwalony na dysku."; } fclose($plik);
  • Dodano możliwość używania przedrostków „0o” i „0O” dla liczb ósemkowych, oprócz wcześniej używanego przedrostka „0”. 016 === 0o16; // prawda 016 === 0O16; // PRAWDA
  • Proponuje się selektywne ograniczenie stosowania $GLOBALS, co doprowadzi do naruszenia kompatybilności wstecznej, ale umożliwi znaczne przyspieszenie operacji na tablicach. Rozważana jest na przykład możliwość wyłączenia zapisu do $GLOBALS i przekazywania $GLOBALS przez wskaźnik. Analiza 2000 pakietów wykazała, że ​​zmiana ta dotknie jedynie 23 z nich. Na przykład, jeśli propozycja zostanie zatwierdzona, wersja 8.1 nie będzie już obsługiwać wyrażeń takich jak: $GLOBALS = []; $GLOBALNE += []; $GLOBALNE =& $x; $x =& $GLOBALNE; rozbrojony($GLOBALS); by_ref($GLOBALS);
  • Metody wewnętrzne powinny teraz zwracać poprawny typ. W PHP 8.1 zwrócenie typu niezgodnego z deklaracją funkcji spowoduje wygenerowanie ostrzeżenia, ale w PHP 9.0 ostrzeżenie zostanie zastąpione błędem.
  • Kontynuowano prace nad przeniesieniem funkcji z korzystania z zasobów na manipulowanie obiektami. Funkcje finfo_* i imap_* zostały przeniesione do obiektów.
  • Przekazywanie wartości null jako argumentów do funkcji wewnętrznych oznaczonych jako niezerowe stało się przestarzałe. W PHP 8.1 użycie konstrukcji takich jak str_contains("string", null) doprowadzi do ostrzeżenia, a w PHP 9 do błędu.
  • Dodano obsługę algorytmów mieszających MurmurHash3 i xxHash.

Źródło: opennet.ru

Dodaj komentarz