♻️ Maksymalizacja kompatybilności PHP dla WordPress 6.4 i katalogu wtyczek
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.2generate_plugins.yml: generuje wtyczkę do wydania, obniżając jej wersję do PHP 7.2integration_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:
- 🦸🏿♂️ Gato GraphQL jest teraz transpilowany z PHP 8.0 do 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
Mam nadzieję, że okaże się to przydatne 🙏