Predvoditelev.RU
Заметки

Поддержка версий PHP в библиотеках

В процессе разработки пакетов Yii3 мы столкнулись с проблемой поднятия минимальной версии PHP. Возникло сразу несколько вопросов:

  • Когда поднимать версию PHP?
  • Поддерживать ли несколько версий PHP?
  • Какие версии PHP поддерживать?

Хорошая идея — привязаться к жизненному циклу самого PHP.

Жизненный цикл PHP
Жизненный цикл PHP на 28 декабря 2022 года

Версия продукта может находится в одним из трёх состояний.

  • Активная поддержка — исправляются все ошибки, добавляется новая функциональность, не ломающая обратную совместимость.
  • Поддержка безопасности — исправляются только критические ошибки, ничего нового не добавляется.
  • Без поддержки — версия заморожена, никаких исправлений или доработок не происходит.

Каждая версия PHP имеет 2 года активной поддержки, затем 1 год поддержки безопасности, а затем поддержка прекращается.

Опираясь на жизненный цикл PHP библиотека должна следовать нескольким принципам.

Во-первых, версия библиотеки с активной поддержкой ДОЛЖНА поддерживать все версии PHP, которые находятся в стадии активной поддержки. Это значит, что самая актуальная версия библиотеки гарантировано будет поддерживать две последних версии PHP.

Во-вторых, у библиотеки ДОЛЖНЫ быть версии получающие исправления ошибок и проблем безопасности, поддерживающие версии PHP, которые находятся в стадии поддержки безопасности. Это значит, что у библиотеки будет версия (может быть самая актуальная, а может предыдущая), которая будет работать в предпредпоследней версии PHP.

Следуя этим принципам, например, на 28 декабря 2022 года библиотека должна поддерживать PHP трёх версий (8.0, 8.1 и 8.2) и может иметь следующие варианты поддержки версий.

Вариант 1. Все версии PHP в одной версии библиотеки.

  • 3.0 в стадии активной поддержки — поддержка PHP 8.0, 8.1, 8.2.

Вариант 2. Разделение по типу поддержки.

  • 3.0 в стадии активной поддержки — поддержка PHP 8.1 и 8.2.
  • 2.0 в стадии поддержки безопасности — поддержка PHP 8.0.

Обратите внимание, что обязательство поддержки актуальных версий PHP совсем не означает, что библиотека должна прекращать поддержку предыдущих версий, то есть библиотека МОЖЕТ иметь поддерживаемые версии с поддержкой версий PHP не получающих обновления.

Пока библиотека не использует возможности новых версий PHP нет смысла поднимать версию PHP, это снизит варианты использования библиотеки, не принеся абсолютно никакой пользы. 

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

Таким образом, до определённого момента поддержка старых версий PHP в библиотеке «бесплатна» и, следовательно, не стоит её убирать. Ситуаций, когда проектам приходится использовать не самую актуальную версию PHP, не так уж и мало:

  • Требуются зависимости, которые не поддерживают актуальную версию PHP.
  • Используется приватный код, на адаптацию которого к актуальной версии PHP нет ресурсов.
  • Нет возможности использовать актуальную версию PHP (часто в госзаказе).
  • Устаревшая инфраструктура без возможности изменить её (например, проект работает на сервере, где уже есть другие проекты, которые используют неактуальную версию PHP).

Но при всё при этом, не стоит тянуть с поднятием минимальной версии PHP и не использовать новые возможности исключительно из-за поддержки старых версий. Как только новые возможности языка могут позволить улучшить код библиотеки — делайте это.  Код станет лучше, его будет легче поддерживать и быстрее внедрять новый функционал. Прогресс не остановить, мы должны двигаться вперёд.

@sergei_predvoditelev — Авторский канал в Telegram: заметки о веб-разработке, PHP, открытом ПО, развитии и немного о жизни.