Новая мажорная версия PHP 8 появилась в конце прошлого года. Я уже много об этом писал, так что не буду здесь повторяться. Как всегда, его производительность становится всё лучше и лучше. Этот факт подтверждают тесты от Kinsta.
Во многом, это заслуга компилятора JIT (Just in time, «на лету»). Он действительно улучшает производительность (что особенно справедливо для математических операций). Но счастье было бы не полным, если бы ранее в PHP 7.4 не появилась предзагрузка. Она компилирует исходные файлы в опкоды и связывает зависимые классы, трейты и интерфейсы. Такой «скомпилированный» фрагмент исполняемого кода (то есть кода, который может использовать PHP-интерпретатор) сохраняется в памяти и становится доступен для всех запросов. Это положительно влияет на производительность, если вы, конечно, не используете виртуальный хостинг.
Стоит также упомянуть атрибуты (они же «аннотации»), именованные параметры (Named Arguments) и объявление свойств в конструкторе (Constructor Property Promotion), поскольку они определённо способствовали тому, что 8-я версия PHP получилась настолько удачной.
Не останавливаясь на достигнутом, PHP Core Team уже работает над следующей версией, PHP 8.1, которая должна выйти к концу 2021 года. На данный момент больше всего заслуживают внимания перечисления (enums) и файберы (fibers, зелёные потоки). Я ещё буду говорить о них позже в этой статье.
Год за годом команда выдаёт стабильные версии с множеством фич и других нововведений, улучшающих жизнь PHP-разработчикам. Среди прочего, в этот раз был усовершенствован процесс миграции. Я достаточно быстро перетащил некоторые из моих собственных проектов с PHP 7.4 на PHP 8: мне потребовалось около часа на каждый проект. Так что, у нас осталось ещё меньше поводов откладывать миграцию.
Наконец-то в PHP добавят перечисления.
enum Status {
case Pending;
case Active;
case Archived;
}
Ниже — пример их использования:
class Order
{
public function __construct(
private Status $status = Status:ending;
) {}
public function setStatus(Status $status): void
{
// …
}
}
$order->setStatus(Status::Active);
Кроме того, появился RFC-запрос на добавление в язык нового типа never.
Использование never будет означать, что функция с таким типом возвращаемого значения не сможет вернуть результат и должна прервать выполнение программы — выбросить исключение, вызвать exit или сделать это каким-то другим способом.
function dd(mixed $input): never
{
// dump
exit;
}
Отмечу, что never принципиально отличается от void: функция с возвращаемым значением типа void способна вернуть результат, а значит, прерывать работу программы нет необходимости. Такое нововведение может показаться слегка необычным, но оно обязательно найдёт применение в статическом анализе кода.
И ещё пару слов о статическом анализе: PhpStorm добавил встроенную поддержку анализаторов Psalm и PhpStan. После этого количество пользователей этих двух продуктов должно увеличиться.
К сожалению, дженерики (generics) по-прежнему нативно не поддерживаются. Есть несколько серьёзных проблем. В первую очередь, не забывайте, что PHP — это всё ещё язык с динамической типизацией. Здесь Nikita уже писал о связанных с этим проблемах. На мой взгляд, самый простой выход — нативно реализовать поддержку лишь так называемых runtime-erased generics, добавив в язык новый синтаксис без применения каких-либо дополнительных проверок типа во время выполнения и полагаясь на статический анализ. Однако, для этого требуется больше, чем просто техническое решение: нужно изменить мышление участников PHP-сообщества в целом. Может быть, когда-нибудь это станет возможным. Когда-нибудь.
Буквально недавно мы узнали, что в PHP 8.1 появятся корутины, также известные как файберы.
Простой пример использования файберов:
$fiber = new Fiber(function (): void {
$valueAfterResuming = Fiber::suspend('after suspending');
// …
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');
Хотя одних только файберов недостаточно для того, чтобы язык стал по-настоящему асинхронным. Они могут лишь стать маленькой шестерёнкой в «большой асинхронной машине».
Однако, соответствующий RFC снова вызвал интерес у «автолюбителей асинхронности», чему мы можем только радоваться. Популярность асинхронных фреймворков, таких как Amphp и ReactPHP, растёт: недавно Laravel объявил о встроенной поддержке Swoole и RoadRunner.
Я не могу не вспомнить о новом релизе Composer 2.0, который вышел в октябре 2020 года. В этой версии есть несколько улучшений UX, но, что важнее всего, она демонстрирует большой прирост производительности. В условиях чистой установки прирост достигает 300%. Разница очень заметна на боевых проектах. Не зря пакетный менеджер Composer де-факто стал стандартом для PHP-разработчиков.
Мне нравится время от времени оценивать состояние экосистемы PHP, просматривая количество пакетов, доступных для скачивания. В прошлом году я говорил о ±25 миллионах загрузок в день. Сегодня это число увеличилось более чем вдвое, и мы уже видим ±60 миллионов загрузок в день.
Наконец, взгляните на этот график, в котором показано, как менялось количество доступных пакетов / версий с течением времени. Его можно найти на сайте Packagist.com. Вы можете сами оценить, как растёт экосистема. И конца этому не видно.
Давайте подытожим, пройдясь по всему, что было добавлено в PHP за последние годы. Если вы не следите за его развитием, матрериалы из списка помогут восполнить этот пробел. Я думаю, он наглядно показывает рост сообщества и команды разработчиков за последние годы. Уверен, что дальше будет ещё лучше.
Так что, PHP жив и чувствует себя очень даже хорошо. С каждым годом я всё больше доволен развитием языка и, конечно же, буду использовать его ещё многие годы!
Источник статьи: https://habr.com/ru/company/macloud/blog/554008/
Во многом, это заслуга компилятора JIT (Just in time, «на лету»). Он действительно улучшает производительность (что особенно справедливо для математических операций). Но счастье было бы не полным, если бы ранее в PHP 7.4 не появилась предзагрузка. Она компилирует исходные файлы в опкоды и связывает зависимые классы, трейты и интерфейсы. Такой «скомпилированный» фрагмент исполняемого кода (то есть кода, который может использовать PHP-интерпретатор) сохраняется в памяти и становится доступен для всех запросов. Это положительно влияет на производительность, если вы, конечно, не используете виртуальный хостинг.
Стоит также упомянуть атрибуты (они же «аннотации»), именованные параметры (Named Arguments) и объявление свойств в конструкторе (Constructor Property Promotion), поскольку они определённо способствовали тому, что 8-я версия PHP получилась настолько удачной.
Не останавливаясь на достигнутом, PHP Core Team уже работает над следующей версией, PHP 8.1, которая должна выйти к концу 2021 года. На данный момент больше всего заслуживают внимания перечисления (enums) и файберы (fibers, зелёные потоки). Я ещё буду говорить о них позже в этой статье.
Год за годом команда выдаёт стабильные версии с множеством фич и других нововведений, улучшающих жизнь PHP-разработчикам. Среди прочего, в этот раз был усовершенствован процесс миграции. Я достаточно быстро перетащил некоторые из моих собственных проектов с PHP 7.4 на PHP 8: мне потребовалось около часа на каждый проект. Так что, у нас осталось ещё меньше поводов откладывать миграцию.
Система типов
Наконец-то в PHP добавят перечисления.
enum Status {
case Pending;
case Active;
case Archived;
}
Ниже — пример их использования:
class Order
{
public function __construct(
private Status $status = Status:ending;
) {}
public function setStatus(Status $status): void
{
// …
}
}
$order->setStatus(Status::Active);
Кроме того, появился RFC-запрос на добавление в язык нового типа never.
Использование never будет означать, что функция с таким типом возвращаемого значения не сможет вернуть результат и должна прервать выполнение программы — выбросить исключение, вызвать exit или сделать это каким-то другим способом.
function dd(mixed $input): never
{
// dump
exit;
}
Отмечу, что never принципиально отличается от void: функция с возвращаемым значением типа void способна вернуть результат, а значит, прерывать работу программы нет необходимости. Такое нововведение может показаться слегка необычным, но оно обязательно найдёт применение в статическом анализе кода.
И ещё пару слов о статическом анализе: PhpStorm добавил встроенную поддержку анализаторов Psalm и PhpStan. После этого количество пользователей этих двух продуктов должно увеличиться.
К сожалению, дженерики (generics) по-прежнему нативно не поддерживаются. Есть несколько серьёзных проблем. В первую очередь, не забывайте, что PHP — это всё ещё язык с динамической типизацией. Здесь Nikita уже писал о связанных с этим проблемах. На мой взгляд, самый простой выход — нативно реализовать поддержку лишь так называемых runtime-erased generics, добавив в язык новый синтаксис без применения каких-либо дополнительных проверок типа во время выполнения и полагаясь на статический анализ. Однако, для этого требуется больше, чем просто техническое решение: нужно изменить мышление участников PHP-сообщества в целом. Может быть, когда-нибудь это станет возможным. Когда-нибудь.
Асинхронный PHP
Буквально недавно мы узнали, что в PHP 8.1 появятся корутины, также известные как файберы.
Простой пример использования файберов:
$fiber = new Fiber(function (): void {
$valueAfterResuming = Fiber::suspend('after suspending');
// …
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');
Хотя одних только файберов недостаточно для того, чтобы язык стал по-настоящему асинхронным. Они могут лишь стать маленькой шестерёнкой в «большой асинхронной машине».
Однако, соответствующий RFC снова вызвал интерес у «автолюбителей асинхронности», чему мы можем только радоваться. Популярность асинхронных фреймворков, таких как Amphp и ReactPHP, растёт: недавно Laravel объявил о встроенной поддержке Swoole и RoadRunner.
Экосистема PHP
Я не могу не вспомнить о новом релизе Composer 2.0, который вышел в октябре 2020 года. В этой версии есть несколько улучшений UX, но, что важнее всего, она демонстрирует большой прирост производительности. В условиях чистой установки прирост достигает 300%. Разница очень заметна на боевых проектах. Не зря пакетный менеджер Composer де-факто стал стандартом для PHP-разработчиков.
Мне нравится время от времени оценивать состояние экосистемы PHP, просматривая количество пакетов, доступных для скачивания. В прошлом году я говорил о ±25 миллионах загрузок в день. Сегодня это число увеличилось более чем вдвое, и мы уже видим ±60 миллионов загрузок в день.
Наконец, взгляните на этот график, в котором показано, как менялось количество доступных пакетов / версий с течением времени. Его можно найти на сайте Packagist.com. Вы можете сами оценить, как растёт экосистема. И конца этому не видно.
Дальше — больше
Давайте подытожим, пройдясь по всему, что было добавлено в PHP за последние годы. Если вы не следите за его развитием, матрериалы из списка помогут восполнить этот пробел. Я думаю, он наглядно показывает рост сообщества и команды разработчиков за последние годы. Уверен, что дальше будет ещё лучше.
- Перечисления (Enums)
- Файберы (Fibers)
- Атрибуты (Attributes)
- Именованные аргументы (Named Arguments)
- Оператор Match
- Объявление свойств в конструкторе (Constructor Property Promotion)
- Короткие замыкания (Short closures)
- Нулевой оператор объединения (Null coalescing operator)
- Трейты (Traits)
- Типизированные свойства (Typed properties)
- Оператор распаковки (Spread operator)
- Компилятор JIT
- Объявление возвращаемого типа (Return type declarations)
- Генераторы (Generators)
- Foreign Function Interface (FFI)
- И многое другое
Так что, PHP жив и чувствует себя очень даже хорошо. С каждым годом я всё больше доволен развитием языка и, конечно же, буду использовать его ещё многие годы!
Источник статьи: https://habr.com/ru/company/macloud/blog/554008/