PHP в 2021 году

На днях в русскоязычном PHP комьюнити прошел онлайн митап, на котором помимо докладов по конкретным темам было обсуждение развития PHP в 2021 году.

Перескажу несколько интересных моментов.

Первый вопрос: сможем ли мы при использовании constructor property promotion задавать в качестве дефолтных значений новые объекты, например, пишем прямо в сигнатуре конструктора private LoggerInterface $logger = new NullLogger()?

Никита Попов (один из ключевых разработчиков PHP) поддерживает эту идею и уже начал работать над реализацией.

Если вспомнить, как PHP работает сейчас: свойствам класса мы можем присвоить значение по умолчанию, но это должно быть константное выражение, так называемое constant expression, которое вычисляется один раз и кэшируется. Нельзя создавать новые объекты оператором new, иначе, как это кэшировать?

Но если мы говорим о constructor property promotion, то создание новых объектов в качестве значений по умолчанию для свойств уже имеет смысл и это был бы удобный синтаксический сахар.

Ещё из хороших новостей: недавно Дмитрием Стоговым была проведена работа над InheritanceCache, что по первым тестам на демо-проекте Symfony дало прирост до 8% производительности. Несмотря на то, что все классы уже давно кэшируются с помощью OPcache, с наследованием всё не так просто, его приходится проводить в runtime на каждый запрос. Теперь и тут будет встроена некая дополнительная система кэширования – Inheritance Cache.

На том же демо-проекте Дмитрий Стогов экспериментирует и над другими нюансами PHP, в частности над сериализацией и над файловым API. Т. е. улучшения производительности идут по всем фронтам!

Пара вопросов от Александра Макарова: будет ли сериализация замыканий и можно ли на уровне языка реализовать Lazy Proxy классы, которые откликаются на instanceof как оригинальные классы, но при этом инициализируют объекты лениво. Это важно для эффективной реализации контейнеров внедрения зависимостей. Краткий ответ Никиты Попова на оба вопроса: НЕТ.

С сериализацией замыканий не просто, и скорее всего решение будет неустойчивым, хрупким, будет ломаться в неожиданных краевых случаях.

А Lazy Proxy классы не нравятся Никите по принципиальным соображениям: не должен instanceofвозвращать true на какие-то lazy обёртки над классами, т. к. это ломает систему типов и вообще неправильно. Если есть какая-то функция, которая возвращает объект определённого типа, то мы не можем про саму эту функцию сказать, что она instanceof возвращаемого объекта.

Вопрос на самом деле более глубокий – а зачем нам вообще что-то инициализировать лениво? А затем, что PHP на каждый запрос умирает, это вопрос исключительно в скорости работы нашего приложения, нашего фреймворка.

И тут обсуждение плавно перешло к RoadRunner и фреймворку Spiral, которые не умирают на каждый запрос! В фреймворке Spiral изначально нет никакого кеширования конфигов и компиляции DI контейнера, от код фреймворка в итоге стал проще и чище, и проблем с производительностью тоже нет.

О планах развития на 2021 год рассказал Антон Титов: подчистить все хвосты и стабилизировать текущие open-source проекты: CycleORM, RoadRunnerSpiral и Temporal.

Ещё один интересный вопрос к Никите Попову: сможем ли мы использовать объекты в качестве ключей массива? Вопрос интересный и, возможно, над этим стоит поработать. Но это изменение определённо очень многое поломает, поэтому сначала хочется собрать обратную связь от комьюнити.

Также на стриме провели обзор результатов опроса русскоязычного комьюнити относительно популярных фреймворков, телеграм каналов, YouTube каналов, подкастов и проч за 2020 год.

В опросе приняли участие 1506 человек.

  • Самый популярный фреймворк – Laravel
  • Самый популярный подкаст – Пятиминутка PHP!
  • YouTube канал: HighLoad Channel
  • Телеграм канал: PHP-дайджест
  • Наиболее популярные компании с экспертизой по PHP: Badoo и SkyEng
  • Персона года: Никита Попов

На этом на сегодня всё, заходите на сайт https://phpcommunity.ru – там вся движуха!