In breve: PHP 8.0 (novembre 2020) ha portato argomenti nominati, attributi, tipi unione, match, l'operatore nullsafe e un compilatore JIT. Poi sono seguite ogni anno: 8.1 con enum e Fiber, 8.2 con classi readonly, 8.3 con costanti di classe tipizzate, 8.4 con property hook e 8.5 con operatore pipe ed estensione URI. Ogni versione dichiara anche obsoleto qualcosa di vecchio. Nell'aggiornamento contano quindi i test e, per la sicurezza, conta soprattutto gestire un ramo supportato con patch aggiornate.
Le novità di PHP 8 in sintesi
La tabella riassume i punti chiave delle pagine di rilascio di php.net. Date del primo rilascio secondo php.net.
| Versione | Uscita | Novità principali | Selezione di deprecazioni e rotture |
|---|---|---|---|
| 8.0 | 26/11/2020 | argomenti nominati, attributi, constructor property promotion, tipi unione, match, ?->, JIT |
0 == 'foobar' ora è false, errori di tipo invece di avvisi |
| 8.1 | 25/11/2021 | enum, proprietà readonly, first-class callable strlen(...), new negli inizializzatori, tipi intersezione, never, Fiber |
– |
| 8.2 | 08/12/2022 | classi readonly, tipi DNF, null/false/true come tipi, estensione Random, costanti nei trait, #[\SensitiveParameter] |
proprietà dinamiche dichiarate obsolete |
| 8.3 | 23/11/2023 | costanti di classe tipizzate, #[\Override], json_validate(), mb_str_pad(), php -l per più file |
– |
| 8.4 | 21/11/2024 | property hook, visibilità asimmetrica, #[\Deprecated], nuova API DOM con HTML5, BcMath\Number, array_find(), lazy object |
parametri implicitamente nullable dichiarati obsoleti; IMAP, OCI8, PDO_OCI, pspell passati a PECL |
| 8.5 | 20/11/2025 | operatore pipe, estensione URI, Clone With, #[\NoDiscard], array_first()/array_last() |
operatore backtick dichiarato obsoleto, disable_classes rimosso |
PHP 8.0 e 8.1: il grande passo
PHP 8.0 ha reso il linguaggio sensibilmente più rigoroso ed espressivo. Secondo la pagina di rilascio, le funzioni interne lanciano ora in modo coerente TypeError o ValueError, invece di emettere solo avvisi. I confronti tra numeri e stringhe seguono regole più pulite.
<?php
// PHP 8.0: match confronta in modo rigoroso e non richiede break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: operatore nullsafe
$land = $bestellung?->kunde?->adresse?->land;
PHP 8.1 ha portato gli enum, cioè tipi enumerativi con valori fissi, e le proprietà readonly, che si possono impostare una sola volta:
<?php
enum Rolle: string {
case Leser = 'leser';
case Redakteur = 'redakteur';
case Admin = 'admin';
}
final class Benutzer {
public function __construct(
public readonly string $name,
public readonly Rolle $rolle,
) {}
}
$b = new Benutzer('Erika', Rolle::from('redakteur'));
Rolle::from() lancia un errore con valori sconosciuti. Ciò impedisce che stringhe arbitrarie provenienti da moduli passino come ruolo. Chi invece di un errore vuole un valore vuoto usa Rolle::tryFrom(), che con valori sconosciuti restituisce null.
Sono nuovi in 8.1 anche i Fiber, una base per flussi concorrenti su cui si fondano le librerie per l'elaborazione asincrona. Nel normale esercizio di un sito web se ne nota poco, nei framework moderni e nelle code invece sì.
PHP 8.2 e 8.3: riordinare e mettere in sicurezza
PHP 8.2 ha dichiarato obsolete le proprietà dinamiche. Chi assegna a un oggetto una proprietà non dichiarata riceve un avviso; con #[\AllowDynamicProperties] lo si può consentire per singole classi. I plugin più vecchi generano perciò spesso molti messaggi nel log.
Interessanti per la sicurezza sono la nuova estensione Random, il cui randomizer predefinito usa secondo la pagina di rilascio un generatore di numeri casuali crittograficamente sicuro, e l'attributo #[\SensitiveParameter], che nasconde negli stack trace valori come le password. Maggiori dettagli sui valori casuali sicuri in Numeri casuali e token sicuri in PHP.
PHP 8.3 ha aggiunto le costanti di classe tipizzate, l'attributo #[\Override] contro gli errori di battitura nell'override dei metodi e json_validate(), che verifica il JSON senza decodificarlo completamente.
PHP 8.4 e 8.5: strumenti moderni del linguaggio
PHP 8.4 ha introdotto i property hook, cioè logica direttamente sulle proprietà, e la visibilità asimmetrica come public private(set). In più una nuova API DOM con supporto HTML5 e funzioni come array_find(), array_any() e array_all(). Secondo la pagina di rilascio le estensioni IMAP, OCI8, PDO_OCI e pspell sono state spostate dal core a PECL. Le applicazioni che usano ad esempio IMAP hanno allora bisogno di un pacchetto separato.
PHP 8.5 ha portato l'operatore pipe, che concatena le chiamate da sinistra a destra:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Risultato: "neue-produkte-2026"
È nuova anche un'estensione URI che scompone gli indirizzi secondo la RFC 3986 e lo standard WHATWG URL. È rilevante per la sicurezza, perché gli URL interpretati in modo non uniforme sono una causa nota di controlli aggirati. L'operatore backtick come forma abbreviata di shell_exec() è dichiarato obsoleto, l'impostazione disable_classes è stata rimossa. Chi la usava dovrebbe adeguare il proprio hardening.
Novità, aggiornamenti e PHP2Shell
Le nuove funzioni del linguaggio non chiudono vulnerabilità nell'interprete. Contro PHP2Shell aiuta solo lo stato di patch aggiornato del rispettivo ramo: 8.5.12, 8.4.27, 8.3.36 o 8.2.35. Per PHP 8.1 e 8.0 non esistono più aggiornamenti ufficiali. Chi è fermo lì deve fare l'upgrade e, in questo, le novità aiutano poco, mentre le rotture molto.
Un percorso di aggiornamento sicuro in cinque passaggi:
- Stabilire la versione di destinazione, in linea con i requisiti di sistema del produttore e con il ciclo di rilascio.
- Portare le dipendenze tramite Composer e i plugin a versioni compatibili.
- Verificare il codice con analisi statica e test rispetto alla versione di destinazione.
- Provare in un ambiente di test con una copia dei dati di produzione, valutando i log per le deprecazioni.
- Passare alla nuova versione, riavviare tutti i processi PHP e documentare lo stato.
Approfondimenti sui tipi sono in Il sistema dei tipi di PHP.
Come aiuta concretamente PHP SOS?
- Verificare la compatibilità: analizziamo il Suo codice e le Sue estensioni alla ricerca di rotture rispetto alla versione di destinazione.
- Eseguire l'upgrade: con la migrazione a una versione di PHP supportata portiamo le applicazioni, con test, a una versione più recente.
- Adeguare l'hardening: sostituiamo le impostazioni rimosse come
disable_classescon alternative efficaci. - Mantenere le patch: dopo l'upgrade manteniamo il ramo aggiornato e documentiamo ogni riavvio.
Domande frequenti
Quale versione di PHP 8 dovrei usare oggi?
Per i nuovi progetti PHP 8.4 o 8.5, perché sono supportate più a lungo: 8.4 fino alla fine del 2028, 8.5 fino alla fine del 2029. Decisivo è che cosa supporta la Sua applicazione secondo i requisiti di sistema del produttore. PHP 8.2 termina il 31 dicembre 2026.
Che cosa si rompe più spesso nel passaggio da PHP 7.4 a PHP 8?
Spesso sono i controlli di tipo più rigidi: in PHP 8 le funzioni interne lanciano TypeError o ValueError invece di emettere solo avvisi. Si notano anche i confronti modificati tra numeri e stringhe. L'analisi statica e i test ne scoprono la maggior parte in anticipo.
Il JIT rende il mio sito più veloce?
Di solito appena. Secondo la pagina di rilascio di PHP 8.0 le prestazioni delle tipiche applicazioni web sono più o meno al livello di PHP 7.4, mentre i compiti ad alto carico di calcolo possono trarne vantaggio sensibile. Da PHP 8.4 il JIT è disattivato per impostazione predefinita.
Quali novità aiutano la sicurezza?
Tra le altre la nuova estensione Random di PHP 8.2 con impostazione predefinita crittograficamente sicura, l'attributo SensitiveParameter contro le password negli stack trace, enum e proprietà readonly per dati più univoci e gli errori di tipo più coerenti da PHP 8.0.