Блог

♻️ Максимизируем совместимость PHP для WordPress 6.4 и каталога плагинов

Leonardo Losoviz
Автор: Leonardo Losoviz ·

Выпущен 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.2
  • generate_plugins.yml: Генерирует плагин для release, понижая его версию до PHP 7.2
  • integration_tests.yml: Устанавливает только что сгенерированный плагин на набор инстансов InstaWP с разными версиями PHP и запускает интеграционные тесты

Чтобы узнать больше, я написал несколько статей на эту тему:

Надеюсь, это окажется полезным 🙏


Подпишитесь на нашу рассылку

Будьте в курсе всех обновлений Gato GraphQL.