Zaprezentowano pierwsze wydanie alfa nowej gałęzi języka programowania PHP 8.1. Premiera stabilnej wersji zaplanowana jest na 25 listopada. Najważniejsze nowości, które są już dostępne do testów lub planowane do wdrożenia w PHP 8.1:
- Dodano obsługę wyliczeń (enum), dzięki czemu można teraz używać następujących konstrukcji: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
- Dodano obsługę lekkich wątków, nazywanych fiberami (Fiber), które umożliwiają zarządzanie współbieżnością na niskim poziomie. Obsługa fiberów ma zostać dodana do frameworków Amphp i ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
- Ulepszono implementację pamięci podręcznej kodu obiektowego (opcache), w której pojawiła się możliwość buforowania informacji o dziedziczeniu klas. Ta optymalizacja pozwoliła zwiększyć wydajność niektórych aplikacji o 5–8%.
- Operator rozpakowywania wewnątrz tablic „…$var”, który pozwala wstawiać istniejące tablice podczas definiowania nowej tablicy, został rozszerzony o obsługę kluczy tekstowych (wcześniej obsługiwane były tylko identyfikatory liczbowe). Na przykład teraz można użyć w kodzie: $array1 = [„a” => 1]; $array2 = [„b” => 2]; $array = [„a” => 0, …$array1, …$array2]; var_dump($array); // [„a” => 1, „b” => 2]
- Pojawił się nowy typ „never”, którego można używać do informowania analizatorów statycznych, że funkcja przerywa wykonanie programu, na przykład przez zgłoszenie wyjątku lub wywołanie funkcji exit. function dd(mixed $input): never { exit; }
- Zaproponowano nową funkcję array_is_list, która pozwala określić, czy klucze w tablicy są ułożone w rosnącej kolejności wartości liczbowych, zaczynając od 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); // false
- Wprowadzono możliwość przesłaniania stałych klasowych podczas dziedziczenia. Aby zabronić przesłaniania stałych klasy nadrzędnej, można użyć słowa kluczowego «final». class Foo { public const X = «foo»; final public const Z = «foo»; } class Bar extends Foo { public const X = «bar»; }
- Udostępniono funkcje fsync i fdatasync do wymuszonego zapisu zmian z pamięci podręcznej dysku. $file = fopen(«sample.txt», «w»); fwrite($file, «Some content»); if (fsync($file)) { echo «File has been successfully persisted to disk.»; } fclose($file);
- Dodano możliwość używania prefiksów «0o» i «0O» dla liczb ósemkowych, oprócz wcześniej stosowanego prefiksu «0». 016 === 0o16; // true 016 === 0O16; // true
- Zaproponowano selektywne ograniczenie użycia $GLOBALS, co spowoduje naruszenie wstecznej kompatybilności, ale pozwoli znacząco przyspieszyć operacje na tablicach. Na przykład rozważana jest możliwość zakazu zapisu do $GLOBALS oraz przekazywania $GLOBALS przez referencję. Analiza 2000 pakietów wykazała, że zmiana ta wpłynie tylko na 23 z nich. Na przykład w przypadku zaakceptowania propozycji w 8.1 zostanie zakończona obsługa takich wyrażeń jak: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
- Kontynuowano prace nad przejściem funkcji z użycia zasobów na operowanie obiektami. Funkcje finfo_* i imap_* zostały przeniesione na obiekty.
- Za przestarzałe uznano przekazywanie wartości null jako argumentów do funkcji wewnętrznych oznaczonych jako non-nullable. W PHP 8.1 użycie konstrukcji takich jak str_contains(«string», null) będzie powodować ostrzeżenie, a w PHP 9 błąd.
- Dodano obsługę algorytmów haszowania MurmurHash3 i xxHash.
Źródło: opennet.ru
