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

13 июня 2021 года

Представлен первый альфа-выпуск новой ветки языка программирования 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.

Источники

править


 
 
Creative Commons
Эта статья содержит материалы из статьи «Началось альфа-тестирование PHP 8.1», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.