Vydání programovacího jazyka PHP 8.1

Po roce vývoje bylo představeno vydání programovacího jazyka PHP 8.1. Nová větev obsahuje řadu nových funkcí a také několik změn, které narušují kompatibilitu.

Klíčová vylepšení v PHP 8.1:

  • Byla přidána podpora pro výčty, například nyní můžete používat následující konstrukce: enum Status { case Pending; pouzdro Aktivní; případ Archivován; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Přidána podpora pro odlehčená vlákna nazvaná Fibers, která vám umožňují spravovat spouštěcí vlákna na nízké úrovni. Plánuje se přidání podpory Fiber do rámců Amphp a ReactPHP. $vlákno = nové vlákno(funkce (): void { $valueAfterResuming = vlákno::suspend('po pozastavení'); // ... }); $valueAfterSuspending = $vlákno->start(); $fiber->resume('po obnovení');
  • Byla vylepšena implementace mezipaměti objektového kódu (opcache), která umožňuje ukládat do mezipaměti informace o dědičnosti tříd. Optimalizace umožnila zvýšit výkon některých aplikací o 5-8%. Mezi další optimalizace patří optimalizace provozu JIT, implementace podpory JIT pro architekturu ARM64 (AArch64), zrychlení překladu názvů, optimalizace knihoven timelib a ext/date, zvýšení výkonu serializace a deserializace, optimalizace funkcí get_declared_classes(), explode() , funkce strtr(), strnatcmp(), dechex(). Obecně platí, že u Symfony Demo došlo k nárůstu výkonu o 23.0 % a u WordPressu o 3.5 %.
  • Operátor rozbalování uvnitř polí "...$var", který umožňuje náhradu 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 digitální identifikátory). Například nyní můžete v kódu použít: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Je povoleno používat klíčové slovo "new" v inicializátorech, například v definicích funkcí jako výchozí parametr nebo v atributech argumentů. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Je možné označit vlastnosti třídy pro přístup pouze pro čtení (informace v takových vlastnostech lze zapsat pouze jednou, poté již nebudou dostupné pro změnu). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Jiné'; > Chyba: Nelze upravit vlastnost pouze pro čtení Post::$title
  • Pro volatelné objekty byla implementována nová syntaxe – uzávěr lze nyní vytvořit voláním funkce a předáním hodnoty „...“ jako argumentu (tj. myFunc(...) místo Closure::fromCallable('myFunc ')): function foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Přidána plná podpora typů křižovatek, což vám umožní vytvářet nové typy kombinací stávajících. Na rozdíl od sjednocených typů, které definují kolekce dvou nebo více typů, typy průniků nevyžadují přítomnost žádného z uvedených typů, ale všech zadaných typů v sadě, které mají být vyplněny. function createSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Existuje nový typ „nikdy“, který lze použít k informování statických analyzátorů, že funkce ukončí provádění programu, například vyvoláním výjimky nebo provedením funkce ukončení. function dd(mix $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í rostoucích číselných hodnot, počínaje 0: $list = [“a”, “b”, “c”]; pole_je_seznam($seznam); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // Nepravdivé
  • Nyní můžete použít klíčové slovo "final", abyste zabránili přepsání konstant nadřazené třídy. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Závažná chyba: Bar::X nemůže přepsat konečnou konstantu Foo::X }
  • Funkce fsync a fdatasync jsou navrženy k vynucení uložení změn z diskové mezipaměti. $soubor = fopen("sample.txt", "w"); fwrite($soubor, "Nějaký obsah"); if (fsync($soubor)) { echo "Soubor byl úspěšně uložen na disk."; } fclose($soubor);
  • Přidána možnost používat předpony „0o“ a „0O“ pro osmičková čísla, kromě dříve používané předpony „0“. 016 === 0o16; // pravda 016 === 0O16; // skutečný
  • Navrhuje se selektivně omezit používání $GLOBALS, což povede k narušení zpětné kompatibility, ale umožní výrazně zrychlit operace s poli. Zvažuje se například možnost zakázat zápis do $GLOBALS a předat $GLOBALS ukazatelem. Analýza 2000 balíčků ukázala, že pouze 23 z nich bude touto změnou ovlivněno. Pokud je například návrh schválen, verze 8.1 již nebude podporovat výrazy jako: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBÁLNÍ; unset($GLOBALS); by_ref($GLOBALS);
  • Interní metody by nyní měly vracet správný typ. V PHP 8.1 vrácení typu, který neodpovídá deklaraci funkce, vyvolá varování, ale v PHP 9.0 bude varování nahrazeno chybou.
  • Pokračovaly práce na přenosu funkcí z používání zdrojů na manipulaci s objekty. Funkce finfo_* a imap_* byly přeneseny do objektů.
  • Předávání hodnot null jako argumentů interním funkcím označeným bez možnosti null bylo zastaralé. V PHP 8.1 povede použití konstrukcí jako str_contains("string", null) k varování a v PHP 9 k chybě.
  • Přidána podpora pro hashovací algoritmy MurmurHash3 a xxHash.

Zdroj: opennet.ru

Přidat komentář