Jak przygotować witrynę WordPress pod PHP 8

Opublikowany: 2022-07-06

Witryny WordPress wymagają PHP, a wraz z rozwojem PHP WordPress nadąża za nimi. Ostatnio PHP 7.4 było domyślną wersją PHP na platformie VIP WordPress. Jednak ponieważ PHP 7.4 kończy wsparcie bezpieczeństwa w listopadzie 2022 r., witryny WordPress będą musiały zostać uaktualnione, aby zachować silne zabezpieczenia. Z tego powodu platforma WordPress VIP przeniesie wszystkie nasze aplikacje klienckie do pracy w PHP 8.0.

Poniżej znajduje się opis zmian oraz kroki, które mogą wykonać zarówno nasi klienci, jak i inne osoby korzystające z WordPressa na innych platformach.

Spis treści

  • Historia PHP 8.0
    • Nowe funkcje
    • Rozprzestrzenianie się wsparcia w społecznościach PHP i WordPress
  • Jak znaleźć problemy ze zgodnością PHP 8.0?
    • Użyj PHP_CodeSniffer ze standardem PHPCompatibility
    • Zaadresuj znane ostrzeżenia PHP, które są krytycznymi błędami PHP w PHP 8.0
    • Twórz testy automatyczne
    • Użyj PHPStan/Psalm lub innego narzędzia do analizy statycznej
  • Jak rozpocząć pracę z PHP 8.0 na WordPressie?
    • Uruchom aplikację lokalnie
    • Sprawdź bota do analizy kodów VIP na pull requestach
    • Włącz PHP 8 w swoich aplikacjach WordPress VIP
    • Wykorzystaj proaktywną pomoc
  • A co z PHP 8.1?

Historia PHP 8.0

Wydane w listopadzie 2020 r. PHP 8.0 zapewniało kilka ulepszeń i funkcji, dzięki którym nowy kod (i krótszy kod) był bardziej odporny na błędy.

Większość programistów odnajdzie znaczne korzyści w PHP 8.0. Jednak jako główna wersja zawiera kilka przełomowych zmian. To sprawia, że ​​przejście z PHP 7.4 na PHP 8.0 jest trudniejsze niż na przykład zmiana z PHP 7.3 na PHP 7.4. W szczególności było 49 przełomowych zmian w rdzeniu PHP i 169 w całym PHP 8, w tym w bibliotekach i rozszerzeniach, na których może polegać Twój kod.

Dobrą wiadomością jest to, że gdy organizacje przejdą na PHP 8.0, otrzymają wsparcie bezpieczeństwa z głównego projektu PHP do listopada 2023 roku. Po tej dacie organizacja będzie musiała uaktualnić do PHP 8.1, drobnej wersji wymagającej znacznie mniejszej zmiany.

Nowe funkcje

PHP 8.0 został zaprojektowany, aby 1) naprawić przypadki brzegowe i niespójności, aby PHP stał się bardziej solidnym i przewidywalnym językiem skryptowym, oraz 2) zapewnić nowe funkcje, aby ogólnie poprawić język. Należą do nich kilka nowych składni, które:

  • Ułatw pisanie kodu ściśle określonego, na przykład typów unii, typów static i mixed , interfejsu Stringable i zmian w obsłudze liczb.
  • Zmniejsz ilość kodu, który musisz utrzymać, na przykład operator nullsafe, promocję właściwości konstruktora, operator match i nie przechwytujące połowy.
  • Uprość kod, taki jak zezwalanie na ::class na obiektach, końcowy przecinek na listach parametrów, str_contains() , str_starts_with() i str_ends_with() , wyrażenie throw, atrybuty.

Zawiera również nazwane parametry. Warto jednak zauważyć, że rdzeń WordPressa nie twierdzi, że jest zgodny z tą funkcją. Tak więc, chociaż możesz wywoływać własne funkcje niestandardowe z nazwanymi parametrami, nie powinieneś wywoływać funkcji WordPress, ponieważ nazwy parametrów mogą w przyszłości ulec zmianie bez ostrzeżenia.

Rozprzestrzenianie się wsparcia w społecznościach PHP i WordPress

Za każdym razem, gdy publikowana jest nowa wersja PHP, która zawiera nową składnię, potrzeba czasu, aby nowa składnia była obsługiwana w społecznościach PHP i WordPress.

Narzędzia dla programistów PHP

Narzędzia programistyczne PHP, takie jak Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug i różne IDE, muszą rozpoznawać nową składnię nowej wersji PHP. Chociaż PHP jest stale rozwijane, może wystąpić opóźnienie, zanim pełny ekosystem wokół nowej wersji będzie dostępny. Często jednak oprzyrządowanie może być gotowe do pracy, zanim ostateczna wersja jest gotowa, ponieważ prace rozwojowe odbywały się w oparciu o wersje alfa , beta i wersje kandydujące do wydania , które zostały udostępnione przed czasem. Wszystkie te i inne narzędzia obsługują teraz PHP 8.0, co czyni go dobrym wyborem do tworzenia kodu PHP, a szczególnie do tworzenia WordPressa.

Rdzeń WordPressa

Następnie rdzeń WordPressa musi obsługiwać PHP 8.0. Projekt WordPress ma długą historię kompatybilności z nowymi wersjami PHP przed ich wydaniem. Zgodnie z tym dobrze napisanym postem na temat Make WP, WordPress ma „zgodność beta” z PHP 8.0 od czasu wydania WordPress 5.6 w grudniu 2020 r. Co oznacza „zgodność beta”? Oznacza to, że WordPress może działać poprawnie w PHP 8.0, ale funkcje takie jak deklarowanie ścisłych typów w plikach podstawowych WordPressa lub używanie nazwanych parametrów z podstawowymi funkcjami WordPressa nie są obsługiwane.

Platforma VIP WordPress

Platforma WordPress VIP obsługuje PHP 8.0 (i PHP 8.1) od maja 2022 roku, w tym pakiet wtyczek i funkcji, które pozwalają platformie zaspokoić potrzeby przedsiębiorstw.

Wtyczki innych firm

WordPress ma dziesiątki tysięcy wtyczek, a poziom obsługi PHP 8.0 jest bardzo zróżnicowany. Na przykład, nowo zarezerwowane słowa mogą być nadal używane przez wtyczkę lub parametry przekazywane do natywnych funkcji PHP mogą nie być tego typu, jakiego oczekujemy. W związku z tym wtyczki innych firm mogą być jednym z obszarów, w których niezgodności z PHP 8.0 mogą wpłynąć na twoją aplikację.

Poniżej dowiesz się, jak sprawdzić niektóre z tych niezgodności. Opcje obejmują poproszenie osoby/zespołu, aby wykonał poprawki i stworzenie nowej wersji, lub posiadanie wewnętrznego zespołu programistów lub agencji, takiej jak jeden z naszych polecanych partnerów, rozwidlenia wtyczki i samodzielnego wprowadzenia poprawek.

Wtyczki niestandardowe

Prawie każdy klient na platformie VIP WordPress korzysta z jednej lub więcej niestandardowych wtyczek. Podobnie jak wtyczki innych firm, należy je również sprawdzić pod kątem zgodności. Poproszenie oryginalnych programistów o rozwiązanie wykrytych problemów jest zazwyczaj najlepszym sposobem działania.

Motywy zewnętrzne lub niestandardowe

Chociaż wtyczki są najbardziej prawdopodobnym źródłem problemów ze zgodnością, nie zapominaj, że motywy innych firm i niestandardowe również muszą być kompatybilne z PHP 8.0. To samo podejście do sprawdzania zgodności kodu wtyczki dotyczy kodu motywu.

Jak znaleźć problemy ze zgodnością PHP 8.0?

Istnieją cztery główne podejścia, które zespoły programistyczne mogą stosować do przeglądania kodu w celu określenia problemów ze zgodnością:

  1. Użyj PHP_CodeSniffer ze standardem PHPCompatibility.
  2. Rozwiąż znane ostrzeżenia PHP, które są błędami krytycznymi PHP w PHP 8.0.
  3. Twórz testy automatyczne.
  4. Użyj PHPStan/Psalm lub innego narzędzia do analizy statycznej.

Użyj PHP_CodeSniffer ze standardem PHPCompatibility

PHP_CodeSniffer (PHPCS) tokenizuje pliki PHP i wykrywa naruszenia określonego zestawu standardów kodowania. Istnieją pakiety Standardów Kodowania WordPressa oraz nasze własne Standardy Kodowania VIP (do których korzystania zachęcamy klientów).

Istnieją również pakiety o nazwach PHPCompatibility i PHPCompatibilityWP, a standardy te analizują bazę kodu pod kątem zgodności PHP z różnymi wersjami.

Ponieważ wyniki zależą od możliwości i gotowości narzędzia, konieczne jest używanie gałęzi developerskiej develop do czasu wydania wersji 10. Wersja 10 będzie zawierać sniffy związane z kompatybilnością PHP 8.0 (i PHP 8.1). Zapoznaj się z naszą dokumentacją, aby dowiedzieć się, jak skonfigurować konfigurację do korzystania z develop deweloperskiej. Po wydaniu wersji 10 możesz zamiast niej używać tej wersji.

Pakiet PHPCompatbilityWP opiera się na pakiecie PHPCompatibility, ale wyłącza kilka opcji zgodności wstecznej, które zawiera sam rdzeń WordPressa.

Po skonfigurowaniu PHPCS i PHPCompatibility/PHPCompatibilityWP możesz przeprowadzić kontrolę:

 phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>

<path-to-code> może być pojedynczą niestandardową lub zewnętrzną wtyczką lub motywem, jeśli chcesz zacząć od małego, lub całe repozytorium, jeśli chcesz zobaczyć wszystkie naruszenia, które wymagają zbadania i rozwiązania.

Kroki skanowania nie wykryją wszystkich możliwych problemów ze zgodnością wersji PHP (takich jak nieprawidłowe typy wartości środowiska wykonawczego), ale pomogą zidentyfikować najczęstsze problemy związane ze składnią.

Zaadresuj znane ostrzeżenia PHP, które są krytycznymi błędami PHP w PHP 8.0

W PHP 8.0 pojawiło się kilka przeklasyfikowanych ostrzeżeń silnika, gdzie ostrzeżenia stały się krytycznymi błędami, a wyjątki typu błędu (a niektóre powiadomienia stały się ostrzeżeniami). Teksty ostrzeżeń PHP, których należy szukać w PHP 7.4, to:

  • Attempt to assign property '*' of non-object
  • Attempt to modify property '*' of non-object
  • Attempt to increment/decrement property '*' of non-object
  • Creating default object from empty value
  • Cannot use a scalar value as an array
  • Cannot add element to the array as the next element is already occupied
  • Cannot unset offset in a non-array variable
  • Only arrays and Traversables can be unpacked
  • Invalid argument supplied for foreach()
  • Illegal offset type
  • Illegal offset type in isset or empty
  • Illegal offset type in unset
  • Cannot assign an empty string to a string offset
  • Division by zero
  • Use of undefined constant *

Naprawienie tych ostrzeżeń jest niezbędne, aby aplikacja była kompatybilna z PHP 8.0.

Uwaga: Istnieją inne krytyczne błędy w PHP 8.0, które nie były nawet ostrzeżeniem w PHP 7.4. Przykłady zawierają:

  • Metody prywatne nie mogą być deklarowane jako ostateczne, z wyjątkiem konstruktora.
  • Nieprawidłowe podpisy dla metod magicznych.
  • Weryfikacja sygnatury metody cech abstrakcyjnych
  • Używanie parent:: z klasą nadrzędną.
  • Niezgodne sygnatury metod przeciążonych (zasada substytucji Liskov)

Zajęcie się tymi znanymi zmianami to dobry początek. TypeError będzie konsekwentnie wyrzucany dla wszystkich wewnętrznych funkcji PHP, na przykład w przypadku przekazania nieprawidłowych typów parametrów, nawet jeśli nie zadeklarowano ścisłego sprawdzania typu.

Zauważ też, że operator @ nie będzie już wyciszał krytycznych błędów w PHP 8.0.

Oczywiście Twoja aplikacja nie powinna generować błędów, ostrzeżeń ani powiadomień. Zachęcamy do zwracania się do każdego, co znajdziesz. Niektóre ostrzeżenia PHP w wersji 8.x będą błędami krytycznymi w PHP 9.0, na przykład potencjalnie skutkując nieprawidłową logiką w PHP 8.x. Najlepszą praktyką jest budowanie w czasie programowania przed i po wydaniu, aby naprawić takie problemy oraz te, które „unikają odkrycia” podczas programowania. To także inwestycja w stabilność witryny i możliwość dokładnego spełniania kryteriów akceptacji dla powiązanej funkcji.

Twórz testy automatyczne

Istnieje wiele różnych typów testów automatycznych, ale tutaj mamy na myśli:

  • Testy jednostkowe — mocuje wszelkie funkcje lub klasy zdefiniowane w WordPressie i nie potrzebuje instancji bazy danych, aby była dostępna do uruchamiania testów.
  • Testy integracyjne — ładuje WordPress i korzysta z rzeczywistej testowej bazy danych

Ten temat jest zbyt obszerny, aby dobrze go tutaj omówić, ale należy wziąć pod uwagę kilka rzeczy:

  • Wyniki zależą od kompletności zestawu testów. Jeśli nie masz wielu testów, nie będziesz mieć wystarczającego zasięgu, aby zapewnić kompatybilność.
  • Używaj ścisłych asercji. Na przykład użycie assertEquals() powoduje luźne porównanie, podczas gdy assertSame() również sprawdza typ.
  • Użyj ścisłego pokrycia kodu. Dodaj beStrictAboutCoversAnnotations=”true” i forceCoversAnnotations=”true” do pliku konfiguracyjnego PHPUnit, a następnie użyj adnotacji @covers , aby znaleźć dokładny poziom pokrycia kodu międzynarodowego w testach.
  • Przetestuj szczęśliwe (zachowanie oparte na oczekiwanych danych wejściowych) i niezadowolone (zachowanie oparte na nieoczekiwanych danych wejściowych), aby upewnić się, że funkcje zawodzą w oczekiwany sposób, ponieważ w tym miejscu występuje większość problemów związanych ze ścisłością.
  • Uruchom swoje testy na PHP 8.0. W przypadku testów integracyjnych (WordPress) w 2021 r. wprowadzono zmiany do podstawowego zestawu testowego WordPress, który został odblokowany przy użyciu późniejszych wersji PHPUnit, który z kolei obsługuje PHP 8.0. Jest to obsługiwane przez pakiet WP Test Utils, który obejmuje obsługę PHPUnit Polyfills, Brain Monkey i Mockery, dodatkowe skróty funkcji dla funkcji WordPress oraz dostęp do wszystkich natywnych narzędzi testowych WP, takich jak fabryczne metody tworzenia treści.
  • Rozważ napisanie testów przed próbą naprawy, aby mieć większą pewność, że zmiana zgodności powiodła się.

Użyj PHPStan/Psalm lub innego narzędzia do analizy statycznej

Chociaż PHPCS wykryje pewne niezgodności, istnieją pewne zmiany w czasie wykonywania, których PHPCS nie jest przeznaczony do przechwytywania. Jednym z przykładów, których można by pominąć, są natywne funkcje PHP, które są bardziej rygorystyczne, jeśli chodzi o typy, które mogą być przekazywane jako parametry.

Pomocne może tu być narzędzie takie jak PHPStan, Psalm lub inne narzędzie do analizy statycznej. Jednak, aby były najbardziej efektywne, wymagają, aby baza kodu albo używała ścisłych typów (typów parametrów i zwracanych w kodzie), albo była poprawnie udokumentowana (linie @param i @return w DocBlocks).

Narzędzia te zazwyczaj mają poziomy reguł, które pozwalają najpierw naprawić problemy z najniższym poziomem, a następnie stopniowo integrować narzędzie w celu poprawy jakości bazy kodu.

Możesz dodać wiedzę na temat typów kodu rdzenia WordPress poprzez rozszerzenia takie jak phpstan-wordpress i psalm-plugin-wordpress.

Po skonfigurowaniu każde uruchomienie będzie podświetlać, gdzie przekazujesz nieoczekiwane typy do funkcji, co może spowodować wyrzucenie krytycznych wyjątków TypeError. Każdy z nich będzie musiał zostać naprawiony.

W wielu przypadkach możesz być w stanie pominąć wyjątek TypeError za pomocą bloków try-catch lub rzutowania typów. Jednak zdecydowanie zalecamy, aby tego nie robić. Naprawienie pierwotnej przyczyny doprowadzi do silniejszego, mniej kruchego i podatnego na błędy kodu i prawie zawsze będzie się opłacać na dłuższą metę.

Jak rozpocząć pracę z PHP 8.0 na WordPressie?

Uruchom aplikację lokalnie

Uruchamianie instancji aplikacji lokalnie jest rozsądnym pierwszym krokiem w wykrywaniu i naprawianiu wszelkich problemów ze zgodnością. Chociaż możesz użyć dowolnego lokalnego środowiska programistycznego, aby zapewnić najlepszą parzystość z platformą WordPress VIP, zalecamy lokalne środowisko programistyczne VIP. Uruchamiając polecenie vip dev-env create --php=8.0 (z VIP-CLI 2.9.5 lub nowszym), a następnie wykonując resztę kreatora instalacji, Twoja aplikacja będzie działać lokalnie z PHP 8.0.

Sprawdź bota do analizy kodów VIP na pull requestach

Jeśli spojrzysz na jakiekolwiek żądania ściągnięcia przesłane do Twojego repozytorium w ramach organizacji wpcomvip, zobaczysz bota do analizy kodu VIP, który przekaże Ci opinie na temat PHPCS, lintingu PHP i lintingu SVG.

W kroku PHP Linting bot będzie lintował kod PHP z dowolną wersją PHP używaną przez aplikację, w której wdrażane jest repozytorium. Jeśli ta wersja to PHP 7.4, będzie teraz automatycznie lintować również przy użyciu PHP 8.0 w ramach przygotowań do nadchodzącej zmiany.

Włącz PHP 8 w swoich aplikacjach WordPress VIP

Gdy już wykonasz jak najwięcej sprawdzania i naprawiania lokalnie, nadszedł czas, aby włączyć PHP 8.0 w aplikacji WordPress VIP. Zacznij od najniższego środowiska i sprawdź, czy wszystko wygląda dobrze (w tym dzienniki PHP za pośrednictwem vip-cli lub dzienniki zdrowia w panelu VIP), zanim przejdziesz do środowiska produkcyjnego.

Aby włączyć PHP 8.0 w środowisku, otwórz zgłoszenie Zendesk, informując nas, w której aplikacji i środowisku chcesz go włączyć.

Wkrótce udostępnimy nową funkcję w panelu VIP, aby umożliwić zmianę wersji PHP bez konieczności otwierania zgłoszenia. Zawsze sprawdzaj w Lobby najnowsze informacje.

Wykorzystaj proaktywną pomoc

Zespoły ds. kont klientów Premier kontaktują się już z klientami, aby omówić, w jaki sposób możemy im pomóc. Otrzymają oni wyniki z PHPCS i zapewnią wskazówki dotyczące samodzielnego przeprowadzania tych kontroli. Ostrzeżenia PHP, które staną się błędami krytycznymi, również zostaną podświetlone, dając im przewagę w rozwiązywaniu problemów z niekompatybilnością.

A co z PHP 8.1?

Platforma WordPress VIP obsługuje również PHP 8.1. Jest mniej zmian między PHP 8.0 i PHP 8.1 niż między PHP 7.4 a 8.0, co oznacza, że ​​powinno być mniej niezgodności do usunięcia.

PHP 8.1:

  • Posiada aktywne wsparcie od głównych programistów PHP do listopada 2023 r. oraz wsparcie bezpieczeństwa do listopada 2024 r.
  • Może obsłużyć więcej żądań na sekundę niż PHP 8.0.
  • Obsługuje „zgodność z wersją beta” w WordPressie 5.9 i nowszych – oznacza to, że w przygotowaniu dla PHP 9 są pewne powiadomienia o wycofaniu, ale nie ma to wpływu na zachowanie rdzenia WordPressa.

Przydatne zmiany wymagane dla PHP 8.0, takie jak używanie ściśle wpisanego kodu i dodawanie automatycznych testów, pomogą we wdrożeniu PHP 8.1, a także uaktualnieniach dla WordPressa 6.1, 6.2, 6.3 i nowszych, a także wszelkich wydanych funkcji. Proces kontroli jakości jest często wąskim gardłem, więc korzystanie z niektórych z przedstawionych przez nas narzędzi i podejść może ograniczyć pracę ręczną i zapewnić większą pewność podczas wdrażania tych zmian.

Jeśli klienci mają pytania dotyczące PHP 8.0, prosimy o otwarcie zgłoszeń u nas.