Разработчики представили новую версию языка программирования PHP 8.1. Вместе с преподавателем Хекслета Владленом Гилязетдиновым рассказываем о важных изменениях и объясняем, почему ее так долго ждали.
Введение Enum избавляет от необходимости использовать костыльные решения (например, создавать перечисления из классов) и подтягивать сторонние пакеты. Обновление действительно ждали — об этом свидетельствует популярность руководств по реализации перечислений в PHP и библиотек Enum и PHP-enum.
Перечисление в виде типа дает контроль над кодом, помогает соблюдать принцип DRY и снизить сложность восприятия кода.
Предположим, что приложение должно учитывать времена года. Хорошо, если они реализованы в виде строк (например, $season = 'winter'
), но если речь идет о числах в виде $season = 0
, код очень скоро начинает вызывать вопросы. Строки и числа, используемые для перечислений, тяжело валидировать. Для каждой функции, в которую приходит строка или число $enumVar
, нужно проверять, что все работает хорошо. С Enum валидация становится проще:
enum Status
{
case Draft;
case Published;
case Archived;
}
function acceptStatus(Status $status) {...}
Фича полезна при реализации объектов типа value
и data transfer
. Она предназначена для работы с вычисляемыми значениями и позволяет не беспокоиться, что значение будет перезаписано.
При организации классов бывают случаи, когда нужна «вычисляемая константа». В предыдущих версиях разработчик создавал функцию, которая вызывается каждый раз, когда нужно получить значение константы, и забивает стек вызовов. Альтернативное решение — использование статистических переменных, которые повышают вероятность ошибки из-за своей изменчивости. Readonly поможет однозначно понять, что переменную присвоили, и работать с ее значением.
class BlogData
{
public readonly Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
}
Примитивы, которые позволяют синхронно держать в памяти несколько процессов и запускать каждый из них при необходимости. Вероятно, главная задача нововведения — сделать «асинхронные» участки кода быстрее и упростить их поддержку.
$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];
Файбер вряд ли будет широко использоваться при разработке ПО на высоких уровнях. Но на более низких (фреймворки Laravel, Symfony, Yii2, etc; пакеты для асинхронной работы ReactPHP и Amp) они точно будут полезны. В частности, для повышения производительности, переписывания части блоков кода с yield
и, возможно, для переписывания реализаций корутин на основе генератора.
fdatasync
в данном случае — ссылка на fsync
.serialize()/unserialize()
на __serialize()/__unserialize()
Оставшиеся обновления можно поделить на два типа:
Отдельно стоит отметить прирост производительности в новой версии: на 23% для демо-приложения на фреймворке Symfony и на 3,5% для WordPress по сравнению с PHP 8. Важно понимать, что производительность часто индивидуальна и зависит от конкретного приложения.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях