Cum să vă pregătiți site-ul WordPress pentru PHP 8

Publicat: 2022-07-06

Site-urile WordPress necesită PHP și, pe măsură ce PHP a evoluat, WordPress a ținut pasul. Cel mai recent, PHP 7.4 a fost versiunea implicită a PHP pe platforma VIP WordPress. Cu toate acestea, deoarece PHP 7.4 ajunge la sfârșitul suportului de securitate în noiembrie 2022, site-urile WordPress vor trebui să facă upgrade pentru a menține o securitate puternică. Din acest motiv, platforma WordPress VIP va muta toate aplicațiile clienților noștri pentru a rula pe PHP 8.0.

Ceea ce urmează este o descriere a modificărilor și a pașilor pe care atât clienții noștri, cât și alții care folosesc WordPress pe alte platforme îi pot face pentru a se pregăti.

Cuprins

  • Povestea PHP 8.0
    • Functii noi
    • Proliferarea suportului în comunitățile PHP și WordPress
  • Cum să găsiți probleme de compatibilitate cu PHP 8.0
    • Utilizați PHP_CodeSniffer cu standardul PHPCompatibility
    • Adresați avertismentele PHP cunoscute care sunt erori fatale PHP sub PHP 8.0
    • Creați teste automate
    • Utilizați PHPStan/Psalm sau un alt instrument de analiză statică
  • Cum să începeți cu PHP 8.0 pe WordPress VIP
    • Rulați aplicația local
    • Verificați botul de analiză a codurilor VIP pe solicitările de extragere
    • Activați PHP 8 în aplicațiile dvs. VIP WordPress
    • Folosiți ajutorul proactiv
  • Dar PHP 8.1?

Povestea PHP 8.0

Lansat în noiembrie 2020, PHP 8.0 a oferit câteva îmbunătățiri și caracteristici care au făcut codul nou (și codul mai scurt) mai rezistent împotriva erorilor.

Majoritatea dezvoltatorilor vor găsi beneficii substanțiale în PHP 8.0. Cu toate acestea, ca versiune majoră, conține mai multe modificări de ruptură. Acest lucru face trecerea de la PHP 7.4 la PHP 8.0 mai dificilă decât, de exemplu, schimbarea de la PHP 7.3 la PHP 7.4. Mai exact, au existat 49 de modificări de bază la PHP de bază și 169 în întregul PHP 8, inclusiv în bibliotecile și extensiile pe care se poate baza codul tău.

Vestea bună este că, odată ce organizațiile vor trece la PHP 8.0, vor primi suport de securitate din partea proiectului de bază PHP până în noiembrie 2023. După această dată, o organizație va trebui să facă upgrade la PHP 8.1, o versiune minoră care necesită o modificare mult mai mică.

Functii noi

PHP 8.0 a fost conceput pentru a 1) remedia cazurile marginale și inconsecvențele pentru a face PHP un limbaj de scripting mai solid și mai previzibil și 2) să ofere noi caracteristici pentru a îmbunătăți limbajul în general. Acestea includ câteva sintaxe noi care:

  • Faceți mai ușoară scrierea codului cu tastare strictă, de exemplu, tipuri de uniuni, tipuri static și mixed , interfață cu Stringable și modificări în manipularea numerelor.
  • Reduceți cantitatea de cod pe care trebuie să o mențineți, de exemplu, operator nullsafe, promovare a proprietății constructorului, operator de match și capturi fără captură.
  • Simplificați codul, cum ar fi permisiunea ::class pe obiecte, virgulă finală în listele de parametri, str_contains() , str_starts_with() și str_ends_with() , expresie aruncată, atribute.

Include, de asemenea, Parametri Numiți. Cu toate acestea, merită remarcat că miezul WordPress nu pretinde compatibilitate cu această caracteristică. Deci, deși vă puteți apela propriile funcții personalizate cu parametri numiți, nu ar trebui să apelați funcții WordPress, deoarece numele parametrilor se pot schimba fără avertisment în viitor.

Proliferarea suportului în comunitățile PHP și WordPress

Ori de câte ori este lansată o nouă versiune de PHP care include o nouă sintaxă, este nevoie de timp pentru ca noile sintaxe să fie acceptate în comunitățile PHP și WordPress.

Instrumente pentru dezvoltatori PHP

Instrumentele de dezvoltare PHP, cum ar fi Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug și diverse IDE-uri trebuie să recunoască noile sintaxe ale unei noi versiuni de PHP. În timp ce PHP este în curs de dezvoltare, poate exista un interval de timp înainte ca întregul ecosistem din jurul unei noi versiuni să fie disponibil. Adesea, totuși, uneltele pot fi gata de funcționare până la momentul în care versiunea finală este gata, deoarece munca de dezvoltare a avut loc pe baza versiunilor alpha , beta și versiuni candidate care au fost puse la dispoziție din timp. Toate aceste instrumente și multe altele acceptă acum PHP 8.0, ceea ce îl face o alegere bună pentru dezvoltarea codului PHP și în special pentru dezvoltarea WordPress.

Miezul WordPress

În continuare, miezul WordPress trebuie să accepte PHP 8.0. Proiectul WordPress are o istorie lungă de compatibilitate cu noile versiuni de PHP până la lansare. Conform acestei postări bine scrise pe Make WP, WordPress a avut „compatibilitate beta” cu PHP 8.0 de la lansarea WordPress 5.6 în decembrie 2020. Ce înseamnă „compatibilitate beta”? Înseamnă că WordPress poate funcționa bine pe PHP 8.0, dar caracteristici precum declararea unor tipuri stricte în fișierele de bază WordPress sau utilizarea parametrilor numiți cu funcțiile de bază ale WordPress nu sunt acceptate.

Platforma VIP WordPress

Platforma WordPress VIP acceptă PHP 8.0 (și PHP 8.1) din mai 2022, inclusiv suita de plugin-uri și funcții care permit platformei să răspundă nevoilor întreprinderii.

Pluginuri de la terți

WordPress are zeci de mii de pluginuri, iar nivelul de suport pentru PHP 8.0 variază foarte mult. De exemplu, cuvintele nou rezervate ar putea fi încă folosite de un plugin, sau parametrii care trec la funcțiile native PHP ar putea să nu fie de tipul așteptat acum. Ca atare, pluginurile de la terți pot fi un domeniu în care incompatibilitățile cu PHP 8.0 ar putea afecta aplicația dvs.

Mai jos puteți afla cum să verificați unele dintre aceste incompatibilități. Opțiunile includ solicitarea persoanei/echipei din amonte să facă remedierile și să facă o nouă lansare, sau ca o echipă de dezvoltare internă sau o agenție, cum ar fi unul dintre partenerii noștri prezentați, să furnizeze pluginul și să facă singuri remediile.

Pluginuri personalizate

Aproape fiecare client de pe platforma WordPress VIP utilizează unul sau mai multe pluginuri personalizate. La fel ca și pluginurile de la terți, trebuie verificate și compatibilitatea acestora. A cere dezvoltatorilor inițiali să abordeze problemele descoperite este, în general, cel mai bun curs de acțiune.

Teme de la terți sau personalizate

Deși pluginurile sunt cea mai probabilă sursă de probleme de compatibilitate, nu uitați că temele terțe și personalizate trebuie, de asemenea, să fie compatibile cu PHP 8.0. Aceeași abordare de verificare a compatibilității codului pluginului se aplică codului temei.

Cum să găsiți probleme de compatibilitate cu PHP 8.0

Există patru abordări principale pe care echipele de dezvoltare le pot folosi pentru a revizui codul pentru a determina problemele de compatibilitate:

  1. Utilizați PHP_CodeSniffer cu standardul PHPCompatibility.
  2. Adresați avertismentele PHP cunoscute care sunt erori fatale PHP sub PHP 8.0.
  3. Creați teste automate.
  4. Utilizați PHPStan/Psalm sau un alt instrument de analiză statică.

Utilizați PHP_CodeSniffer cu standardul PHPCompatibility

PHP_CodeSniffer (PHPCS) tokenizează fișierele PHP și detectează încălcări ale unui set definit de standarde de codare. Există pachete pentru standardele de codare WordPress și propriile noastre standarde de codare VIP (pe care încurajăm clienții să le folosească).

Există, de asemenea, pachete numite PHPCompatibility și PHPCompatibilityWP, iar aceste standarde analizează o bază de cod pentru compatibilitatea între versiuni PHP.

Deoarece rezultatele depind de capabilitățile și gradul de pregătire al instrumentului, este esențial să folosiți ramura de develop a PHPCompatibility până la lansarea versiunii 10. Versiunea 10 va conține sniff-urile legate de compatibilitatea PHP 8.0 (și PHP 8.1). Consultați documentele noastre pentru instrucțiuni despre cum să vă configurați configurația pentru a utiliza ramura de develop . Odată ce versiunea 10 este lansată, puteți utiliza acea versiune.

Pachetul PHPCompatbilityWP se bazează pe pachetul PHPCompatibility, dar dezactivează câteva verificări pentru elementele de compatibilitate inversă pe care miezul WordPress le conține.

Cu PHPCS și PHPCompatibility/PHPCompatibilityWP configurate, puteți efectua o verificare:

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

<path-to-code> ar putea fi un singur plugin sau o temă personalizată sau terță parte dacă doriți să începeți mic, sau întregul depozit dacă doriți să vedeți toate încălcările care trebuie investigate și abordate.

Pașii de scanare nu vor detecta toate problemele posibile de compatibilitate cu versiunea PHP (cum ar fi tipurile incorecte de valori de rulare), dar vor ajuta la identificarea celor mai frecvente probleme legate de sintaxă.

Adresați avertismentele PHP cunoscute care sunt erori fatale PHP sub PHP 8.0

PHP 8.0 a văzut câteva avertismente de motor reclasificate, unde Avertismentele au devenit erori fatale și Excepții de tip Eroare de tip (și unele Notificări au devenit Avertismente). Textele de avertizare PHP de căutat sub PHP 7.4 sunt:

  • 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 *

Remedierea acestor avertismente este esențială pentru ca aplicația să fie compatibilă cu PHP 8.0.

Notă: Există și alte erori fatale sub PHP 8.0 care nu au fost nici măcar un Avertisment sub PHP 7.4. Exemplele includ:

  • Metodele private nu pot fi declarate finale cu excepția constructorului.
  • Semnături nevalide pentru metode magice.
  • Validarea semnăturii metodei trăsăturilor abstracte
  • Folosind parent:: cu o clasă parent.
  • Semnături de metodă supraîncărcate incompatibile (Principiul de înlocuire Liskov)

Abordarea acestor schimbări cunoscute este un loc bun de început. TypeError va fi trimis în mod constant pentru toate funcțiile interne PHP, de exemplu atunci când sunt transmise tipuri de parametri nevalidi, chiar și atunci când verificarea strictă a tipului nu este declarată.

De asemenea, rețineți că operatorul @ nu va mai reduce la tăcere erorile fatale sub PHP 8.0.

Desigur, aplicația dvs. ar trebui să nu producă erori, avertismente și notificări. Sunteți încurajat să vă adresați oricărui lucru pe care îl găsiți. Unele avertismente PHP sub 8.x vor fi erori fatale sub PHP 9.0, de exemplu, care pot duce la o logică incorectă în PHP 8.x. Construirea timpului de dezvoltare înainte și după lansare pentru a remedia astfel de probleme și cele care „scăpa de descoperire” în timpul dezvoltării este cea mai bună practică. Este, de asemenea, o investiție în stabilitatea site-ului și capacitatea sa de a îndeplini cu acuratețe criteriile de acceptare pentru caracteristica asociată.

Creați teste automate

Există multe tipuri diferite de teste automate, dar aici ne referim la:

  • Teste unitare — batjocorește orice funcții sau clase definite de WordPress și nu are nevoie de o instanță a unei baze de date pentru a fi disponibilă pentru a rula testele.
  • Teste de integrare — încarcă WordPress și utilizează o bază de date de testare reală

Acest subiect este prea amplu pentru a fi acoperit bine aici, dar există câteva lucruri de luat în considerare:

  • Rezultatele depind de caracterul complet al suitei de teste. Dacă nu aveți multe teste, atunci vă va lipsi acoperirea necesară pentru a asigura compatibilitatea.
  • Folosiți afirmații stricte. De exemplu, utilizarea assertEquals() face o comparație liberă, în timp ce assertSame() verifică și tipul.
  • Utilizați o acoperire strictă de cod. Adăugați beStrictAboutCoversAnnotations=”true” și forceCoversAnnotations=”true” în fișierul de configurare PHPUnit, apoi utilizați adnotările @covers pentru a găsi nivelul precis de acoperire a codului internațional în cadrul testelor.
  • Testați căile fericit (comportament bazat pe intrări așteptate) și nefericit (comportament bazat pe intrări neașteptate) pentru a vă asigura că funcțiile eșuează într-un mod așteptat, deoarece aici apar cele mai multe probleme legate de strictețe.
  • Rulați testele pe PHP 8.0. Pentru testele de integrare (WordPress), au fost făcute modificări în 2021 la suita de teste de bază WordPress, care s-a deblocat folosind versiunile ulterioare ale PHPUnit, care la rândul său acceptă PHP 8.0. Acest lucru este susținut de pachetul WP Test Utils, care include suport PHPUnit Polyfills, Brain Monkey și Mockery, stub-uri de funcții suplimentare pentru funcțiile WordPress și acces la toate utilitățile de testare native WP, cum ar fi metodele din fabrică pentru crearea de conținut.
  • Luați în considerare să scrieți teste înainte de a încerca o remediere, pentru a fi mai sigur că modificarea de compatibilitate a avut succes.

Utilizați PHPStan/Psalm sau un alt instrument de analiză statică

În timp ce PHPCS va detecta unele incompatibilități, există unele modificări ale timpului de execuție pe care PHPCS nu este proiectat să le prindă. Un exemplu care ar fi ratat este că funcțiile PHP native sunt mai stricte cu tipurile care pot fi transmise ca parametri.

Un instrument precum PHPStan, Psalm sau un alt instrument de analiză statică poate ajuta aici. Dar, pentru a fi cel mai eficient, ele necesită ca baza de cod fie să utilizeze tipuri stricte (tipuri de parametri și returnare în cod), fie să fie documentate corect (liniile @param și @return în DocBlocks).

Aceste instrumente au de obicei niveluri de reguli care permit mai întâi remedierea problemelor de cel mai scăzut nivel, apoi integrarea treptată a instrumentului pentru a îmbunătăți calitatea bazei de cod.

Puteți adăuga cunoștințe pentru tipurile de cod de bază WordPress prin extensii precum phpstan-wordpress și psalm-plugin-wordpress.

Odată configurată, fiecare rulare va evidenția locul în care treceți tipuri neașteptate în funcții, ceea ce poate duce la apariția excepțiilor fatale TypeError. Fiecare dintre acestea va trebui reparat.

În multe cazuri, este posibil să puteți suprima o excepție TypeError prin utilizarea blocurilor try-catch sau typecasting. Cu toate acestea, vă recomandăm insistent să nu o faceți. Remedierea cauzei principale va duce la un cod mai puternic, mai puțin fragil și predispus la erori și aproape întotdeauna va da roade pe termen lung.

Cum să începeți cu PHP 8.0 pe WordPress VIP

Rulați aplicația local

Rularea unei instanțe a aplicației la nivel local este un prim pas sensibil pentru a putea detecta și remedia orice probleme de compatibilitate. Deși puteți folosi orice mediu de dezvoltare locală, pentru a asigura cea mai bună paritate cu platforma WordPress VIP, vă recomandăm Mediul de dezvoltare locală VIP. Prin rularea comenzii vip dev-env create --php=8.0 (cu VIP-CLI 2.9.5 sau o versiune ulterioară) și apoi completând restul expertului de configurare, aplicația dumneavoastră va rula local cu PHP 8.0.

Verificați botul de analiză a codurilor VIP pe solicitările de extragere

Dacă vă uitați la orice solicitări de extragere făcute către depozitul dvs. în cadrul organizației wpcomvip, veți vedea Botul de analiză a codului VIP care vă oferă feedback despre PHPCS, PHP lining și SVG lining.

Pentru pasul PHP Linting, bot-ul va căma codul PHP cu orice versiune de PHP care este utilizată pentru o aplicație în care se instalează depozitul. Dacă versiunea respectivă este PHP 7.4, acum va scame automat folosind și PHP 8.0, în pregătirea pentru schimbarea viitoare.

Activați PHP 8 în aplicațiile dvs. VIP WordPress

Odată ce ați făcut cât mai multe verificări și remedieri la nivel local, este timpul să activați PHP 8.0 în aplicația dvs. VIP WordPress. Începeți cu cel mai de jos mediu și verificați dacă totul arată bine (inclusiv jurnalele PHP prin vip-cli sau jurnalele de sănătate din tabloul de bord VIP) înainte de a trece la mediul de producție.

Pentru a activa PHP 8.0 într-un mediu, deschideți un bilet Zendesk care ne anunță în ce aplicație și mediu doriți să fie activat.

În curând, vom lansa o nouă funcție pe tabloul de bord VIP pentru a permite modificarea versiunii PHP fără a fi nevoie să deschidem un bilet. Verificați întotdeauna lobby-ul pentru cele mai recente informații.

Folosiți ajutorul proactiv

Echipele de cont pentru clienții Premier iau legătura deja cu clienții pentru a discuta despre cum îi putem sprijini. Li se vor trimite rezultatele de la PHPCS și li se vor oferi îndrumări despre cum să ruleze ei înșiși aceste verificări. Vor fi evidențiate și avertismentele PHP care vor deveni erori fatale, oferindu-le un avans în abordarea incompatibilităților.

Dar PHP 8.1?

Platforma WordPress VIP acceptă și PHP 8.1. Există mai puține modificări între PHP 8.0 și PHP 8.1 decât există între PHP 7.4 și 8.0, ceea ce înseamnă că ar trebui să existe mai puține incompatibilități de rezolvat.

PHP 8.1:

  • Are suport activ de la dezvoltatorii de bază PHP până în noiembrie 2023 și asistență de securitate până în noiembrie 2024.
  • Poate gestiona mai multe solicitări pe secundă decât PHP 8.0.
  • Are suport pentru „compatibilitate beta” pe WordPress 5.9 și versiuni ulterioare – aceasta înseamnă că există unele notificări de depreciere în pregătire pentru PHP 9, dar nu afectează comportamentul nucleului WordPress.

Modificările utile necesare pentru PHP 8.0, cum ar fi utilizarea codului tastat strict și adăugarea de teste automate, vă vor ajuta cu lansarea PHP 8.1, precum și cu upgrade-uri pentru WordPress 6.1, 6.2, 6.3 și versiunile ulterioare, precum și orice lansări de caracteristici pe care le faceți. Procesul de asigurare a calității este adesea blocajul, așa că utilizarea unora dintre instrumentele și abordările pe care le-am subliniat poate reduce munca manuală și vă poate oferi mai multă încredere atunci când implementați aceste modificări.

Dacă clienții au întrebări despre PHP 8.0, vă rugăm să deschideți biletele cu noi.