# Da PHP 8.0 a 8.5: le novità principali

> Novità di PHP 8 da 8.0 a 8.5: le funzioni principali per versione, esempi di codice, deprecazioni con rischi d'aggiornamento e rilevanza per la sicurezza.

Fonte: https://phpsos.de/it/php/php-8-neuerungen/  
Stato: 25/10/2026  
Fornitore: PHP SOS, Assistenza di emergenza PHP e sicurezza dei server. Assistenza immediata su WhatsApp: https://wa.me/491736494914?text=Buongiorno%20PHP%20SOS%2C%20abbiamo%20bisogno%20di%20aiuto%20con%20il%20nostro%20server%20PHP.%20Azienda%3A%20%E2%80%A6%20Sito%20web%3A%20%E2%80%A6

**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
// 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
<?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](https://phpsos.de/it/blog/sichere-tokens-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
<?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:

1. Stabilire la versione di destinazione, in linea con i requisiti di sistema del produttore e con il [ciclo di rilascio](https://phpsos.de/it/php/release-zyklus/).
2. Portare le dipendenze tramite Composer e i plugin a versioni compatibili.
3. Verificare il codice con analisi statica e test rispetto alla versione di destinazione.
4. Provare in un ambiente di test con una copia dei dati di produzione, valutando i log per le deprecazioni.
5. Passare alla nuova versione, riavviare tutti i processi PHP e documentare lo stato.

Approfondimenti sui tipi sono in [Il sistema dei tipi di PHP](https://phpsos.de/it/php/typsystem/).

## 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](https://phpsos.de/it/leistungen/php-migration-legacy/) portiamo le applicazioni, con test, a una versione più recente.
- **Adeguare l'hardening:** sostituiamo le impostazioni rimosse come `disable_classes` con 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.

## Fonti

- [php.net: rilascio di PHP 8.0](https://www.php.net/releases/8.0/en.php)
- [php.net: rilascio di PHP 8.4](https://www.php.net/releases/8.4/en.php)
- [php.net: rilascio di PHP 8.5](https://www.php.net/releases/8.5/en.php)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [php.net: versioni supportate](https://www.php.net/supported-versions.php)
