24 ноября 2021 года на сайте php.net появилось уведомление о выходе PHP 8.1.0. Это последний второстепенный выпуск, в котором разработчики существенно увеличили производительность языка и добавили множество новых функций. Посмотрим основные обновления и комментарии к релизу от пользователей Reddit.

В PHP 8.1 появился новый тип данных — перечисления (enum). Они заменяют набор констант и позволяют описывать структуры с фиксированным количеством значений. Это облегчает процесс прототипирования приложений и повышает надёжность кода.
enum Status
{
case Draft;
case Published;
case Archived;
}
function acceptStatus(Status $status) {...}
В предыдущих версиях PHP разработчики не могли устанавливать неизменяемые объекты значений — у них не получалось один раз инициализировать нужные свойства и больше к ним не возвращаться. Приходилось делать все свойства закрытыми, использовать общедоступный геттер и жертвовать потребительской эргономикой.
Теперь можно добавлять Readonly-свойства, которые не будут менять значения объектов после инициализации. Это особенно полезно при работе с объектами значений или передачи данных, которые нужно защитить от вмешательства извне.
class BlogData
{
public readonly Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
}
Следующая фича — файберы. Это низкоуровневые компоненты, которые нужны для упрощения управления параллелизмом в PHP. С помощью файберов можно находить, приостанавливать и возобновлять выполнения блоков кода из разных позиций стека. Функция получит поддержку во фреймворках ReactPHP и Amph.
$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];
В инициализаторах появилась поддержка new-выражений, которые можно использовать внутри значений параметров, для аргументов атрибутов, вложенных атрибутов, инициализаторов статистический переменных и глобальных констант.
class MyController {
public function __construct(
private Logger $logger = new NullLogger(),
) {}
}
Чтобы посмотреть все изменения, нужно посетить страницу официального пресс-релиза PHP 8.1. Для обновления загрузите исходный код и руководство по миграции. Если вы пишете код в PhpStorm — почитайте, какие функции из PHP 8.1 уже есть в IDE.
На Reddit основная часть разработчиков довольна тем, как развивается PHP и какие новые возможности в нём появляется. Из негативных моментов можно отметить комментарий пользователя SavishSalacious, который хочет увидеть в новой версии дженерики.

Ещё можно выделить сообщение пользователя L3tum, который не спешит обновлять проекты на PHP 8.1 из-за возможных ошибок в совместимости со старыми версиями. На этот комментарий ответил jpresutti, который перевёл на новую версию PHP свой фреймворк FEAST и не обнаружил проблем. Больше это никто не обсуждал.
