Byla představena první alfa-verze nové větve programovacího jazyka PHP 8.1. Uvolnění je naplánováno na 25. listopadu. Mezi hlavní novinky, které jsou již dostupné pro testování nebo se plánují do PHP 8.1, patří:
- Byla přidána podpora enumerací, například nyní je možné použít následující konstrukce: 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);
- Byla přidána podpora lehkých vláken, nazývaných fibery (Fiber), které umožňují řídit paralelizaci na nízké úrovni. Podpora fiberů má být přidána do rámců Amphp a ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
- Byla vylepšena implementace cache objektového kódu (opcache), ve které se objevila možnost cachování informací o dědění tříd. Optimalizace umožnila zvýšit výkon některých aplikací o 5-8%.
- Operátor rozbalování uvnitř polí „…$var“, který umožňuje provádět substituci existujících polí při definování nového pole, byl rozšířen o podporu řetězcových klíčů (dříve byly podporovány pouze číselné identifikátory). Například nyní je možné použít v kódu: $array1 = [„a“ => 1]; $array2 = [„b“ => 2]; $array = [„a“ => 0, …$array1, …$array2]; var_dump($array); // [„a“ => 1, „b“ => 2]
- Objevil se nový typ „never“, který lze použít k informování statických analyzátorů, že funkce ukončuje vykonávání programu, například vyvoláním výjimky nebo provedením funkce exit. function dd(mixed $input): never { exit; }
- Byla navržena nová funkce array_is_list, která umožňuje určit, že klíče v poli jsou uspořádány v pořadí zvyšujících se číselných hodnot, počínaje 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
- Byla navržena možnost přepsání konstant v třídě během dědění. Pro zákaz přepisování konstant nadřazené třídy lze použít klíčové slovo „final“. class Foo { public const X = „foo“; final public const Z = „foo“; } class Bar extends Foo { public const X = „bar“; }
- Byly navrženy funkce fsync a fdatasync pro vynucení uložení změn z diskové cache. $file = fopen(„sample.txt“, „w“); fwrite($file, „Nějaký obsah“); if (fsync($file)) { echo „Soubor byl úspěšně uložen na disk.“; } fclose($file);
- Byla přidána možnost použití prefixů „0o“ a „0O“ pro osmičková čísla, vedle dříve používaného prefixu „0“. 016 === 0o16; // true 016 === 0O16; // true
- Bylo navrženo selektivně omezit použití $GLOBALS, což povede k narušení zpětné kompatibility, ale umožní značné zrychlení operací s poli. Například se zvažuje zákaz zápisu do $GLOBALS a předání $GLOBALS přes ukazatel. Analýza 2000 balíčků ukázala, že toto změnu zasáhne pouze 23 z nich. Například v případě schválení návrhu v 8.1 bude zastavena podpora takových výrazů, jako jsou: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
- Pokračovalo se v převodu funkcí z používání zdrojů na manipulaci s objekty. Na objekty byly převedeny funkce finfo_* a imap_*.
- Bylo vyhlášeno zastaralé předávat hodnoty null jako argumenty interním funkcím, které jsou označeny jako non-nullable. V PHP 8.1 použití konstrukcí jako str_contains(„string“, null) povede k varování, a v PHP 9 k chybě.
- Byla přidána podpora hashovacích algoritmů MurmurHash3 a xxHash.
Zdroj: opennet.ru
