Началось альфа-тестирование PHP 8.1

Представлен первый альфа-выпуск новой ветки языка программирования 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('after suspending');
        
           // … 
       });
     
       $valueAfterSuspending = $fiber->start();
     
       $fiber->resume('after resuming');
    
  • Улучшена реализация кэша объектного кода (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); 
    
  • Продолжена работа по переводу функций c использования ресурсов на манипуляцию объектами. На объекты переведены функции finfo_* и imap_*.

  • Объявлена устаревшей передача значений null в качестве аргументов внутренних функций, помеченных как non-nullable. В PHP 8.1 использование конструкций вида str_contains («string», null) будет приводить к предупреждению, а в PHP 9 к ошибке.

  • Добавлена поддержка алгоритмов хэширования MurmurHash3 и xxHash.



Источник: http://www.opennet.ru/opennews/art.shtml? num=55322

© OpenNet