Blog

♻️ Maksymalizacja kompatybilności PHP dla WordPress 6.4 i katalogu wtyczek

Leonardo Losoviz
Autor: Leonardo Losoviz ·

WordPress 6.4 "Shirley" został wydany. Zalecane jest uruchamianie go z PHP 8.1 lub 8.2, jednak minimalna obsługiwana wersja PHP nadal wynosi 7.0.

Dlatego nasze wtyczki WordPress muszą (w miarę możliwości) obsługiwać PHP aż do wersji 7.0 i być kompatybilne z PHP 8.1 i 8.2.

Najbardziej logicznym sposobem jest programowanie naszych wtyczek w PHP 7.0, unikając przy tym:

  • Używania funkcji, które zostały zdeprecjonowane w PHP 7.x, gdyż zostały one usunięte w PHP 8.x
  • Używania funkcji, które zostały zdeprecjonowane w PHP 8.x, gdyż spowodują one ostrzeżenia

Aby mieć pewność, że kod wtyczki jest kompatybilny, musimy dokładnie przetestować go w kilku środowiskach, uruchamiając różne wersje PHP.

Programowanie w PHP 7.x ma wyraźną wadę: kod wtyczki musi być kompatybilny z PHP 8.x, ale nie może korzystać z żadnych jego funkcji, takich jak union types, wyrażenie match, operator nullsafe i wiele innych.

Istnieje lepsza alternatywa.

Obniżanie wersji kodu PHP z 8.x do 7.x

Zamiast programować w PHP 7 i upewniać się, że działa z PHP 8, możemy zrobić odwrotnie: napisać wtyczkę w PHP 8 i obniżyć jej wersję do PHP 7.

Jest to możliwe dzięki Rector, narzędziu do automatycznego refaktoryzowania kodu PHP.

Rector udostępnia reguły do obniżania wersji kodu z PHP 8.1 do PHP 7.2. Oznacza to, że możemy korzystać z tych nowoczesnych funkcji w naszych wtyczkach WordPress, ponieważ mogą być one przekształcone w kod PHP 7.2.

Na przykład reguła DowngradeMatchToSwitchRector konwertuje operator match na operator 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;
+        }
    }
}

Należy zauważyć, że reguły służą do obniżania wersji tylko do PHP 7.2, nie aż do PHP 7.1 i 7.0. Nie stanowi to jednak większego problemu, ponieważ obie te wersje PHP łącznie stanowią jedynie 3% witryn WordPress.

Obniżanie wersji kodu to lepsze podejście, ponieważ:

  • Programując w PHP 8.1, mamy absolutną pewność, że nasz kod będzie kompatybilny z PHP 8.1 i 8.2.
  • Dopóki używamy funkcji PHP, dla których istnieją reguły obniżania wersji, kod będzie również działał w PHP 7.2, 7.3 i 7.4.
  • Możemy korzystać z funkcji PHP 8.x, takich jak union types, wyrażenie match, operator nullsafe i wiele innych.

Należy pamiętać, że nie wszystkie funkcje PHP 8.x są dostępne. Na przykład nie istnieje (jeszcze) reguła do obniżania wersji enumeracji, dlatego nie możemy z nich korzystać.

Jeśli chodzi o testy, nie ma różnicy: musimy również dokładnie przetestować wtyczkę w kilku środowiskach, uruchamiając różne wersje PHP, aby mieć pewność.

Jak obniżać wersję kodu

Gato GraphQL jest rozwijane z użyciem PHP 8.1 i ma obniżoną wersję do PHP 7.2 dla środowiska produkcyjnego.

Obniżanie wersji kodu, jego testowanie i późniejsze wydanie wtyczki dla środowiska produkcyjnego są w pełni zautomatyzowane za pomocą przepływów pracy GitHub Actions:

  • downgrade_php_tests.yml: obniża wersję kodu i analizuje go przy użyciu PHP 7.2
  • generate_plugins.yml: generuje wtyczkę do wydania, obniżając jej wersję do PHP 7.2
  • integration_tests.yml: instaluje nowo wygenerowaną wtyczkę w zestawie instancji InstaWP uruchamiających różne wersje PHP i przeprowadza testy integracyjne

Aby dowiedzieć się więcej, napisałem kilka artykułów na ten temat:

Mam nadzieję, że okaże się to przydatne 🙏


Zapisz się do naszego newslettera

Bądź na bieżąco ze wszystkimi aktualizacjami Gato GraphQL.