Представен е първият алфа-релиз на новата версия на езика за програмиране PHP 8.1. Релизът е насрочен за 25 ноември. Основните нововъведения, които вече са налични за тестване или планирани за реализиране в PHP 8.1:
- Добавена е поддръжка на изброения, например, вече можете да използвате следните конструкции: 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);
- Добавена е поддръжка на лекоимплементирани потоци, наречени фибри (Fiber), които позволяват управление на паралелизиране на ниско ниво. Поддръжката на фибри се планира да бъде добавена във фреймворците Amphp и ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘след спирането’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘след възобновяване’);
- Подобрена е реализацията на кеша на обектния код (opcache), в която е добавена възможност за кеширане на информация за наследяване на класове. Оптимизацията позволи увеличаване на производителността на някои приложения с 5-8%.
- Операторът за разопаковане в масиви «…$var», който позволява подмяна на съществуващи масиви при дефиниране на нов масив, е разширен с поддръжка на стринг ключове (по-рано се поддържаха само цифрови идентификатори). Например, вече можете да използвате в кода: $array1 = [„a” => 1]; $array2 = [„b” => 2]; $array = [„a” => 0, …$array1, …$array2]; var_dump($array); // [„a” => 1, „b” => 2]
- Появи се нов тип «never», който можете да използвате, за да информирате статичните анализатори, че функцията прекратява изпълнението на програмата, например, като извика изключение или извърши функция exit. function dd(mixed $input): never { exit; }
- Предложена е нова функция array_is_list, която позволява да се определи, че ключовете в масива са подредени в нарастващ ред на числовите стойности, започвайки от 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
- Предложена възможност за презаписване на константи в клас в процеса на наследяване. За да се забрани презаписването на константите на родителския клас, може да се използва ключовата дума „final“. class Foo { public const X = "foo"; final public const Z = "foo"; } class Bar extends Foo { public const X = "bar"; }
- Предложени функции fsync и fdatasync за принудително запазване на промени от дисковия кеш. $file = fopen("sample.txt", "w"); fwrite($file, "Some content"); if (fsync($file)) { echo "File has been successfully persisted to disk."; } fclose($file);
- Добавена е възможност за използване на префиксите „0o“ и „0O“ за осемични числа, освен вече използвания префикс „0“. 016 === 0o16; // true 016 === 0O16; // true
- Предложено е изборно ограничаване на приложението на $GLOBALS, което ще доведе до нарушаване на обратно съвместимост, но ще позволи значително ускоряване на операциите с масиви. Например, разглежда се възможността за забрана на запис в $GLOBALS и предаване на $GLOBALS по указател. Анализът на 2000 пакета показа, че само 23 от тях ще бъдат засегнати от това изменение. Например, в случай на одобрение на предложението в 8.1, поддръжката на такива изрази като: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
- Продължава работата по прехвърлянето на функции от използване на ресурси към манипулиране на обекти. Функциите finfo_* и imap_* са прехвърлени на обекти.
- Обявено е за остарело подаването на null стойности като аргументи на вътрешни функции, обозначени като non-nullable. В PHP 8.1 използването на конструкции от вида str_contains("string", null) ще води до предупреждение, а в PHP 9 до грешка.
- Добавена е поддръжка за хеширащи алгоритми MurmurHash3 и xxHash.
Източник: opennet.ru
