Я уже несколько раз писал о том, что происходило с PHP за год и всегда с нетерпением ждал следующего года. Я делал это в 2020-м и 2019-м. И продолжаю делать в 2021-м.
Я всегда повторяю: PHP это уже не тот язык, которым он был десять лет назад, и мы очень этому рады. Сегодня это быстрый и надёжный язык, позволяющий разрабатывать сложные и масштабируемые приложения. Давайте обсудим некоторые из наиболее заметных изменений, которые появились за год — как в самом языке, так и в экосистеме.
От версии 8 к 8.1
Новая мажорная версия 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::Pending;
) {}
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 жив и чувствует себя очень даже хорошо. С каждым годом я всё больше доволен развитием языка и, конечно же, буду использовать его ещё многие годы!
Наши серверы можно использовать для разработки на PHP.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!
ReDev1L
PHP уже другой. 7 лет назад я боролся с magic quotes и другой дребеденью. Сейчас это самый классный язык для веб прототипирования. Экосистема огромная, хороший ООП, много инструментов.
Конечно специфичные вещи лучше сразу писать или потом переписывать на Go/Python, а если много интерактива в браузере — подумать над изоморфами на Nodejs + Vue/React. Тем не менее считаю что сейчас PHP в середине своего золотого века.
somurzakov
простите, а зачем переписывать с быстрого РНР на тормознутый питон?
интересно, а можно ли статически скомпилировать РНР скрипт с интерпретатором и всеми делами в один исполняемый файл (наподобие Go) — была бы тут конкуренция с go или нет?
ReDev1L
Питон — проще с датасетами работать.
Скомпилировать — да можно конечно, но смысла мало, да и паковать PHP extensions — такое себе)
ertaquo
На Python можно получить асинхронность из коробки, используя FastAPI, aiohttp или любой другой асинхронный фреймворк. Когда на PHP появятся полностью асинхронные фреймворки и библиотеки для работы с БД — неизвестно.
Соответственно асинхронное приложение на Python никак не может быть медленнее синхронного PHP при тех же ресурсах.
tzlom
только если эта асинхронность действительно используется а сам питон не считает что-то большое
arthuriantech
С помощью Numba, NumPy, Cython возможно малой кровью поднять скорость вычислений до заоблачных высот. Никто не использует голый CPython для тяжелых вычислений.