♻️ Максимизируем совместимость PHP для WordPress 6.4 и каталога плагинов
Выпущен WordPress 6.4 «Shirley». Рекомендуется запускать его на PHP 8.1 или 8.2, однако минимальная поддерживаемая версия PHP по-прежнему остаётся 7.0.
Следовательно, наши плагины WordPress должны (насколько это возможно) поддерживать PHP вплоть до версии 7.0 и быть совместимы с PHP 8.1 и 8.2.
Наиболее логичный способ сделать это — писать код плагинов на PHP 7.0, при этом:
- Не использовать функции, устаревшие в PHP 7.x, поскольку они будут удалены в PHP 8.x
- Не использовать функции, устаревшие в PHP 8.x, поскольку это вызовет предупреждения
Чтобы убедиться в совместимости кода плагина, необходимо тщательно тестировать его в нескольких средах с разными версиями PHP.
Написание кода на PHP 7.x имеет очевидный недостаток: код плагина должен быть совместим с PHP 8.x, однако не может использовать его возможности — такие как union types, выражение match, оператор nullsafe и многие другие.
Существует лучшая альтернатива.
Понижение версии PHP-кода с 8.x до 7.x
Вместо того чтобы писать на PHP 7 и добиваться работоспособности с PHP 8, можно поступить наоборот: написать плагин на PHP 8 и затем понизить его до PHP 7.
Это возможно благодаря Rector — инструменту для автоматизации рефакторинга PHP-кода.
Rector предоставляет правила для понижения кода с PHP 8.1 до PHP 7.2. Это означает, что мы можем использовать современные возможности в наших плагинах WordPress, поскольку они могут быть преобразованы в код PHP 7.2.
Например, правило DowngradeMatchToSwitchRector преобразует оператор match в оператор switch:
class SomeClass
{
public function run()
{
- $message = match ($statusCode) {
- 200, 300 => null,
- 400 => 'not found',
- default => 'unknown status code',
- };
+ switch ($statusCode) {
+ case 200:
+ case 300:
+ $message = null;
+ break;
+ case 400:
+ $message = 'not found';
+ break;
+ default:
+ $message = 'unknown status code';
+ break;
+ }
}
}Обратите внимание, что правила предназначены для понижения версии до PHP 7.2, но не до PHP 7.1 и 7.0. Впрочем, это не слишком критично, поскольку эти две версии PHP в совокупности составляют лишь 3% сайтов WordPress.
Понижение версии кода — более предпочтительный подход, потому что:
- Программируя на PHP 8.1, мы абсолютно уверены, что наш код будет совместим с PHP 8.1 и 8.2.
- При условии использования PHP-возможностей, для которых существуют правила понижения версии, код также будет работать на PHP 7.2, 7.3 и 7.4.
- Мы можем задействовать возможности PHP 8.x, такие как union types, выражение match, оператор nullsafe и многие другие.
Важно учитывать, что доступны не все возможности PHP 8.x. Например, правила для понижения версии перечислений (enumerations) пока не существует, поэтому их использовать нельзя.
Что касается тестирования, разницы нет: необходимо также тщательно тестировать плагин в нескольких средах с различными версиями PHP, чтобы быть уверенными в результате.
Как понизить версию кода
Gato GraphQL разрабатывается на PHP 8.1 и понижается до PHP 7.2 для production-среды.
Понижение версии кода, его тестирование и последующий выпуск плагина для production полностью автоматизированы с помощью GitHub Actions workflows:
downgrade_php_tests.yml: Понижает версию кода и анализирует его на PHP 7.2generate_plugins.yml: Генерирует плагин для release, понижая его версию до PHP 7.2integration_tests.yml: Устанавливает только что сгенерированный плагин на набор инстансов InstaWP с разными версиями PHP и запускает интеграционные тесты
Чтобы узнать больше, я написал несколько статей на эту тему:
- 🦸🏿♂️ Gato GraphQL теперь транспилируется с PHP 8.0 до 7.1
- Transpiling PHP code from 8.0 to 7.x via Rector
- Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions
Надеюсь, это окажется полезным 🙏