Come preparare il tuo sito WordPress per PHP 8

Pubblicato: 2022-07-06

I siti WordPress richiedono PHP e, man mano che PHP si è evoluto, WordPress ha tenuto il passo. Più recentemente, PHP 7.4 è stata la versione predefinita di PHP sulla piattaforma VIP di WordPress. Tuttavia, poiché PHP 7.4 giunge al termine del supporto per la sicurezza nel novembre 2022, i siti WordPress dovranno eseguire l'aggiornamento per mantenere una forte sicurezza. Per questo motivo, la piattaforma VIP di WordPress sposterà tutte le applicazioni dei nostri clienti in modo che funzionino su PHP 8.0.

Quella che segue è una descrizione delle modifiche e dei passaggi che sia i nostri clienti che altri utenti che utilizzano WordPress su altre piattaforme possono fare per prepararsi.

Sommario

  • La storia di PHP 8.0
    • Nuove caratteristiche
    • Proliferazione del supporto nelle comunità PHP e WordPress
  • Come trovare problemi di compatibilità con PHP 8.0
    • Usa PHP_CodeSniffer con lo standard PHPCompatibility
    • Indirizza gli avvisi PHP noti che sono errori irreversibili di PHP in PHP 8.0
    • Crea test automatizzati
    • Usa PHPStan/Psalm o un altro strumento di analisi statica
  • Come iniziare con PHP 8.0 su WordPress VIP
    • Eseguire l'applicazione in locale
    • Controlla il bot di analisi del codice VIP sulle richieste pull
    • Abilita PHP 8 sulle tue applicazioni VIP di WordPress
    • Sfrutta l'aiuto proattivo
  • Che dire di PHP 8.1?

La storia di PHP 8.0

Rilasciato a novembre 2020, PHP 8.0 ha fornito numerosi miglioramenti e funzionalità che hanno reso il nuovo codice (e il codice più breve) più resiliente ai bug.

La maggior parte degli sviluppatori troverà vantaggi sostanziali in PHP 8.0. Tuttavia, come versione principale, contiene diverse modifiche sostanziali. Ciò rende il passaggio da PHP 7.4 a PHP 8.0 più complicato rispetto, ad esempio, al passaggio da PHP 7.3 a PHP 7.4. In particolare, sono state apportate 49 modifiche sostanziali al core PHP e 169 in tutto PHP 8 in generale, comprese le librerie e le estensioni su cui il codice potrebbe fare affidamento.

La buona notizia è che una volta che le organizzazioni passeranno a PHP 8.0, riceveranno supporto per la sicurezza dal progetto PHP principale fino a novembre 2023. Dopo tale data, un'organizzazione dovrà eseguire l'aggiornamento a PHP 8.1, una versione minore che richiede una modifica molto più piccola.

Nuove caratteristiche

PHP 8.0 è stato progettato per 1) correggere casi limite e incoerenze per rendere PHP un linguaggio di scripting più solido e prevedibile e 2) fornire nuove funzionalità per migliorare il linguaggio in generale. Questi includono diverse nuove sintassi che:

  • Semplifica la scrittura di codice rigorosamente tipizzato, ad esempio tipi di unione, tipi static e mixed , interfaccia Stringable e modifiche nella gestione dei numeri.
  • Riduci la quantità di codice che devi mantenere, ad esempio, operatore nullsafe, promozione della proprietà del costruttore, operatore di match e catture di non acquisizione.
  • Semplifica il codice come consentire ::class su oggetti, virgola finale negli elenchi di parametri, str_contains() , str_starts_with() e str_ends_with() , throw expression, attributi.

Include anche parametri denominati. Tuttavia, vale la pena notare che il core di WordPress non rivendica la compatibilità con questa funzione. Quindi, mentre puoi chiamare le tue funzioni personalizzate con parametri denominati, non dovresti chiamare le funzioni di WordPress, poiché i nomi dei parametri potrebbero cambiare senza preavviso in futuro.

Proliferazione del supporto nelle comunità PHP e WordPress

Ogni volta che viene rilasciata una nuova versione di PHP che include una nuova sintassi, ci vuole tempo prima che le nuove sintassi siano supportate nelle comunità PHP e WordPress.

Strumenti per sviluppatori PHP

Gli strumenti di sviluppo PHP come Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug e vari IDE devono tutti riconoscere le nuove sintassi di una nuova versione di PHP. Mentre PHP è in continuo sviluppo, può esserci un ritardo prima che l'intero ecosistema attorno a una nuova versione sia disponibile. Spesso, tuttavia, gli strumenti possono essere pronti per l'uso quando la versione finale è pronta perché il lavoro di sviluppo è stato eseguito sulla base di versioni alpha , beta e release candidate che sono state rese disponibili in anticipo. Tutti questi strumenti e altri ora supportano PHP 8.0, il che lo rende una buona scelta per lo sviluppo di codice PHP e in particolare per lo sviluppo di WordPress.

Nucleo di WordPress

Successivamente, il core di WordPress deve supportare PHP 8.0. Il progetto WordPress ha una lunga storia di compatibilità con le nuove versioni di PHP al momento del loro rilascio. Secondo questo post ben scritto su Make WP, WordPress ha avuto "compatibilità beta" con PHP 8.0 dal rilascio di WordPress 5.6 a dicembre 2020. Cosa significa "compatibilità beta"? Significa che WordPress può funzionare correttamente su PHP 8.0, ma funzionalità come la dichiarazione di tipi severi nei file core di WordPress o l'utilizzo di parametri denominati con le funzioni principali di WordPress non sono supportate.

Piattaforma VIP WordPress

La piattaforma VIP di WordPress supporta PHP 8.0 (e PHP 8.1) da maggio 2022, inclusa la suite di plug-in e funzionalità che consentono alla piattaforma di soddisfare le esigenze aziendali.

Plugin di terze parti

WordPress ha decine di migliaia di plugin e il livello di supporto per PHP 8.0 varia ampiamente. Ad esempio, le parole appena riservate potrebbero essere ancora utilizzate da un plug-in o i parametri passati alle funzioni native di PHP potrebbero non essere del tipo ora previsto. Pertanto, i plug-in di terze parti potrebbero essere un'area in cui le incompatibilità con PHP 8.0 potrebbero influire sulla tua applicazione.

Di seguito puoi imparare come verificare la presenza di alcune di queste incompatibilità. Le opzioni includono chiedere all'individuo/team a monte di eseguire le correzioni e creare una nuova versione, oppure avere un team di sviluppo interno o un'agenzia, come uno dei nostri partner in primo piano, per eseguire il fork del plug-in e apportare le correzioni da soli.

Plugin personalizzati

Quasi tutti i clienti sulla piattaforma VIP di WordPress utilizzano uno o più plugin personalizzati. Come i plug-in di terze parti, anche loro devono essere verificati per verificarne la compatibilità. Chiedere agli sviluppatori originali di affrontare i problemi scoperti è generalmente la migliore linea d'azione.

Temi di terze parti o personalizzati

Sebbene i plug-in siano la fonte più probabile di problemi di compatibilità, non dimenticare che anche i temi di terze parti e personalizzati devono essere compatibili con PHP 8.0. Lo stesso approccio alla verifica della compatibilità del codice del plug-in si applica al codice del tema.

Come trovare problemi di compatibilità con PHP 8.0

Esistono quattro approcci principali che i team di sviluppo possono utilizzare per esaminare il codice per determinare i problemi di compatibilità:

  1. Usa PHP_CodeSniffer con lo standard PHPCompatibility.
  2. Risolvere gli avvisi PHP noti che sono errori irreversibili PHP in PHP 8.0.
  3. Crea test automatizzati.
  4. Usa PHPStan/Psalm o un altro strumento di analisi statica.

Usa PHP_CodeSniffer con lo standard PHPCompatibility

PHP_CodeSniffer (PHPCS) tokenizza i file PHP e rileva le violazioni di un insieme definito di standard di codifica. Esistono pacchetti per gli standard di codifica di WordPress e i nostri standard di codifica VIP (che incoraggiamo i clienti a utilizzare).

Esistono anche pacchetti chiamati PHPCompatibility e PHPCompatibilityWP e questi standard analizzano una base di codice per la compatibilità tra versioni PHP.

Poiché i risultati dipendono dalle capacità e dalla prontezza dello strumento, è essenziale utilizzare il ramo di develop di PHPCompatibility fino al rilascio della versione 10. La versione 10 conterrà gli sniff relativi alla compatibilità con PHP 8.0 (e PHP 8.1). Consulta i nostri documenti per istruzioni su come impostare la configurazione per utilizzare il ramo di develop . Una volta rilasciata la versione 10, puoi invece utilizzare quella versione.

Il pacchetto PHPCompatbilityWP si basa sul pacchetto PHPCompatibility ma disattiva alcuni controlli per gli elementi di compatibilità con le versioni precedenti contenuti nel core di WordPress stesso.

Con PHPCS e PHPCompatibility/PHPCompatibilityWP impostati, puoi eseguire un controllo:

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

Il <path-to-code> potrebbe essere un singolo plug-in o tema personalizzato o di terze parti se si desidera iniziare in piccolo, o l'intero repository se si desidera vedere tutte le violazioni che devono essere esaminate e affrontate.

I passaggi di scansione non rileveranno tutti i possibili problemi di compatibilità della versione PHP (come tipi di valori di runtime errati), ma aiuteranno a identificare i problemi più comuni relativi alla sintassi.

Indirizza gli avvisi PHP noti che sono errori irreversibili di PHP in PHP 8.0

PHP 8.0 ha visto alcuni avvisi del motore riclassificati, in cui gli avvisi sono diventati fatali Error e TypeError Exceptions (e alcuni avvisi sono diventati avvisi). I testi di avviso PHP da cercare in PHP 7.4 sono:

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

La correzione di questi avvisi è essenziale affinché l'applicazione sia compatibile con PHP 8.0.

Nota: ci sono altri errori fatali in PHP 8.0 che non erano nemmeno un avviso in PHP 7.4. Esempi inclusi:

  • I metodi privati ​​non possono essere dichiarati definitivi ad eccezione del costruttore.
  • Firme non valide per i metodi magici.
  • Convalida della firma del metodo dei tratti astratti
  • Utilizzo di parent:: con una classe genitore.
  • Firme di metodi sovraccaricati incompatibili (principio di sostituzione di Liskov)

Affrontare questi cambiamenti noti è un buon punto di partenza. TypeError verrà generato in modo coerente per tutte le funzioni PHP interne, ad esempio quando vengono passati tipi di parametri non validi, anche quando non viene dichiarato un controllo del tipo rigoroso.

Inoltre, si noti che l'operatore @ non silenzia più gli errori fatali in PHP 8.0.

Naturalmente, l'applicazione idealmente non dovrebbe produrre errori, avvisi e avvisi. Sei incoraggiato ad affrontare qualsiasi cosa trovi. Alcuni avvisi PHP in 8.x saranno errori irreversibili in PHP 9.0, ad esempio, risultando potenzialmente in una logica errata in PHP 8.x. Costruire il tempo di sviluppo prima e dopo il rilascio per risolvere tali problemi e quelli che "sfuggono alla scoperta" durante lo sviluppo è una best practice. È anche un investimento nella stabilità del sito e nella sua capacità di soddisfare accuratamente i criteri di accettazione per la funzione associata.

Crea test automatizzati

Esistono molti tipi diversi di test automatizzati, ma qui intendiamo:

  • Unit test: prende in giro qualsiasi funzione o classe definita da WordPress e non necessita di un'istanza di un database per essere disponibile per eseguire i test.
  • Test di integrazione: carica WordPress e utilizza un database di test effettivo

Questo argomento è troppo grande per essere trattato bene qui, ma ci sono alcune cose da considerare:

  • I risultati dipendono dalla completezza della suite di test. Se non hai molti test, ti mancherà la copertura necessaria per garantire la compatibilità.
  • Usa affermazioni rigorose. Ad esempio, l'uso assertEquals() esegue un confronto libero, mentre assertSame() controlla anche il tipo.
  • Usa una copertura del codice rigorosa. Aggiungi beStrictAboutCoversAnnotations=”true” e forceCoversAnnotations=”true” al file di configurazione PHPUnit, quindi usa le annotazioni @covers per trovare il livello accurato di copertura del codice internazionale tra i test.
  • Testare i percorsi felici (comportamento basato su input previsti) e infelice (comportamento basato su input imprevisti) per garantire che le funzioni falliscano nel modo previsto, poiché è qui che si verificano la maggior parte dei problemi relativi alla rigidità.
  • Esegui i tuoi test su PHP 8.0. Per i test di integrazione (WordPress), nel 2021 sono state apportate modifiche alla suite di test core di WordPress che è stata sbloccata utilizzando le versioni successive di PHPUnit, che a sua volta supporta PHP 8.0. Ciò è supportato dal pacchetto WP Test Utils, che include PHPUnit Polyfills, supporto Brain Monkey e Mockery, stub di funzioni aggiuntive per le funzioni di WordPress e l'accesso a tutte le utilità di test native di WP come i metodi di fabbrica per la creazione di contenuti.
  • Prendi in considerazione la possibilità di scrivere dei test prima di tentare una correzione, per essere più sicuri che la modifica della compatibilità sia andata a buon fine.

Usa PHPStan/Psalm o un altro strumento di analisi statica

Sebbene PHPCS rilevi alcune incompatibilità, ci sono alcune modifiche al runtime che PHPCS non è progettato per rilevare. Un esempio che mancherebbe sono le funzioni PHP native che sono più rigorose con i tipi che possono essere passati come parametri.

Uno strumento come PHPStan, Psalm o un altro strumento di analisi statica può aiutare qui. Ma, per essere più efficaci, richiedono che la tua base di codice utilizzi tipi rigorosi (tipi di parametri e restituiti nel codice) o sia documentata correttamente ( righe @param e @return in DocBlocks).

Questi strumenti in genere hanno livelli di regole che consentono prima di risolvere i problemi di livello più basso e quindi di integrare gradualmente lo strumento per migliorare la qualità della base di codice.

Puoi aggiungere conoscenze per i tipi per il codice core di WordPress tramite estensioni come phpstan-wordpress e psalm-plugin-wordpress.

Una volta configurata, ogni esecuzione evidenzierà dove stai passando tipi imprevisti in funzioni, che possono causare la generazione di eccezioni di tipo irreversibile. Ognuno di questi dovrà essere riparato.

In molti casi, potresti essere in grado di eliminare un'eccezione TypeError tramite l'uso di blocchi try-catch o typecasting. Tuttavia, ti consigliamo vivamente di non farlo. Risolvere la causa principale porterà a un codice più forte, meno fragile e soggetto a errori e quasi sempre ripagherà a lungo termine.

Come iniziare con PHP 8.0 su WordPress VIP

Eseguire l'applicazione in locale

L'esecuzione di un'istanza dell'applicazione in locale è un primo passo sensato per poter rilevare e risolvere eventuali problemi di compatibilità. Sebbene sia possibile utilizzare qualsiasi ambiente di sviluppo locale, per garantire la migliore parità con la piattaforma VIP di WordPress, consigliamo l'ambiente di sviluppo locale VIP. Eseguendo il comando vip dev-env create --php=8.0 (con VIP-CLI 2.9.5 o successivo) e quindi completando il resto dell'installazione guidata, l'applicazione verrà eseguita localmente con PHP 8.0.

Controlla il bot di analisi del codice VIP sulle richieste pull

Se guardi le richieste pull fatte al tuo repository sotto l'organizzazione wpcomvip, vedrai il VIP Code Analysis Bot che ti fornisce feedback su PHPCS, PHP linting e SVG linting.

Per il passaggio PHP Linting, il bot eseguirà in lint il codice PHP con qualsiasi versione di PHP utilizzata per un'applicazione in cui viene distribuito il repository. Se quella versione è PHP 7.4, ora verrà automaticamente lint utilizzando anche PHP 8.0, in preparazione per il prossimo passaggio.

Abilita PHP 8 sulle tue applicazioni VIP di WordPress

Dopo aver eseguito il maggior numero di controlli e correzioni possibile a livello locale, è il momento di abilitare PHP 8.0 sulla tua applicazione VIP di WordPress. Inizia con l'ambiente più basso e controlla che tutto sia a posto (inclusi i log PHP tramite vip-cli o i log di integrità nella dashboard VIP) prima di passare all'ambiente di produzione.

Per abilitare PHP 8.0 su un ambiente, apri un ticket Zendesk indicandoci su quale applicazione e ambiente vuoi che sia abilitato.

Presto rilasceremo una nuova funzionalità nella dashboard VIP per consentire la modifica della versione PHP senza dover aprire un ticket. Controlla sempre la lobby per le ultime informazioni.

Sfrutta l'aiuto proattivo

I team di account per i clienti Premier stanno già contattando i clienti per discutere di come possiamo supportarli. Verranno inviati i risultati da PHPCS e verranno fornite indicazioni su come eseguire questi controlli da soli. Verranno inoltre evidenziati gli avvisi PHP che diventeranno errori irreversibili, dando loro un vantaggio nell'affrontare le incompatibilità.

Che dire di PHP 8.1?

La piattaforma VIP di WordPress supporta anche PHP 8.1. Ci sono meno modifiche tra PHP 8.0 e PHP 8.1 rispetto a PHP 7.4 e 8.0, il che significa che dovrebbero esserci meno incompatibilità da affrontare.

PHP 8.1:

  • Ha il supporto attivo degli sviluppatori PHP core fino a novembre 2023 e il supporto per la sicurezza fino a novembre 2024.
  • Può gestire più richieste al secondo rispetto a PHP 8.0.
  • Ha il supporto per la "compatibilità beta" su WordPress 5.9 e versioni successive: ciò significa che ci sono alcuni avvisi di deprecazione in preparazione per PHP 9, ma non influisce sul comportamento del core di WordPress.

Le utili modifiche richieste per PHP 8.0, come l'utilizzo di codice rigorosamente digitato e l'aggiunta di test automatici, aiuteranno con l'implementazione di PHP 8.1, così come gli aggiornamenti per WordPress 6.1, 6.2, 6.3 e versioni successive, nonché qualsiasi versione di funzionalità che fai. Il processo di QA è spesso il collo di bottiglia, quindi l'utilizzo di alcuni degli strumenti e degli approcci che abbiamo delineato può ridurre il lavoro manuale e darti più sicurezza durante l'implementazione di queste modifiche.

Se i clienti hanno domande su PHP 8.0, apri i ticket con noi.