# PHP 8: tutte le informazioni sulla nuova versione

PHP è un linguaggio di programmazione tra i più facili da imparare. Con un [tutorial](https://www.ionos.it/digitalguide/siti-web/creare-siti/imparare-a-programmare-in-php-tutorial-per-principianti/ "Imparare a programmare in PHP: tutorial per principianti") e la giusta motivazione, in poche ore si può già apprendere a scrivere i primi codici ed eseguire i primi comandi. [PHP 7](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/come-il-php7-rende-internet-piu-veloce/ "Come il PHP7 rende internet più veloce") ha portato con sé un’ottimizzazione della velocità influendo positivamente sul ranking nei motori di ricerca. Ora ilIl linguaggio open source ha ricevuto un **importante aggiornamento alla versione 8.0**, a cui è seguito dopo un anno un aggiornamento minore alla versione più recente, la 8.1.

## Quali sono le caratteristiche di PHP 8.1?

PHP 8.1 è stato rilasciato in versione beta ed è attualmente in fase di test. L'aggiornamento finale arriverà a **novembre 2021**, ma le nuove caratteristiche sono già note. Ecco di quali novità si parla:

- [Enum](https://wiki.php.net/rfc/enumerations "RFC ufficiale di Enums"): le cosiddette Enumerations (enumerazioni con un certo numero di valori) sono ora disponibili come tipo di variabile.
- [Fibers](https://wiki.php.net/rfc/fibers "RFC ufficiale di Fibers"): la nuova tipologia di code block Fibers vi dà la possibilità di eseguire diversi thread di programma in parallelo.
- [Arrays](https://wiki.php.net/rfc/array_unpacking_string_keys "RFC ufficiale di Array unpacking"): a partire da PHP 7.4, è possibile scompattare gli array con valori numerici. Ora questo è possibile anche per gli array con stringhe.
- [Readonly](https://wiki.php.net/rfc/readonly_properties_v2 "RFC ufficiale di Readonly"): d'ora in poi, le proprietà delle classi possono essere marcate come 'readonly' e quindi non sono più modificabili.
- [Intersection](https://wiki.php.net/rfc/pure-intersection-types "RFC ufficiale di Intersection Types"): i tipi di intersezione (fondamentalmente le controparti dei tipi di unione) sono ora disponibili.
- [Never](https://wiki.php.net/rfc/noreturn_type "RFC ufficiale di never return type"): il nuovo valore di ritorno 'never' indica che una funzione è terminata e non restituisce nessun altro valore.
- [Final](https://wiki.php.net/rfc/final_class_const "RFC ufficiale di final flag"): ora potete marcare le costanti di classe con 'final' in modo che non possano essere cambiate dalle sottoclassi.
- [Fsync](https://wiki.php.net/rfc/fsync_function "RFC ufficiale di fsync"): PHP 8.1 introduce le due funzioni 'fsync' e 'fdatasync' per sincronizzare i dati dal buffer al supporto di memorizzazione.
- [Octal](https://wiki.php.net/rfc/explicit_octal_notation "RFC ufficiale di octal prefix"): per visualizzare il sistema numerico ottale, oltre a '0' (zero), si potrà utilizzare anche il prefisso '0o' (zero e O minuscola).
- [Globals](https://wiki.php.net/rfc/restrict_globals_usage "RFC ufficiale di $GLOBALS"): l'uso di '$GLOBALS' è stato leggermente limitato e ora porta in alcuni casi a un messaggio di errore.
- [Null](https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg "RFC ufficiale di Null"): le funzioni interne non accettano più valori nulli per argomenti non annullabili.

---

### N.B.

Questa è solo una selezione dei cambiamenti più interessanti in PHP 8.1. Molte delle altre nuove funzionalità pianificate possono essere trovate nel [Wiki ufficiale con tutte le Request for Comments](https://wiki.php.net/rfc "Wiki su PHP").

---

## PHP 8: rilasciato a novembre 2020

Il **26 novembre 2020** è arrivato ed è stata rilasciata l’ultima versione del popolare linguaggio di scripting, PHP 8. È stata così confermata la **durata del ciclo delle versioni PHP di tre anni**. Il precedente PHP 7.4 è stato attivo circa un anno, prima che il [supporto per PHP 7.1](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/php-71/ "PHP 7.1") venisse interrotto. Anche il supporto per PHP 7.2 è terminato alla fine del 2020.

Tuttavia, molti siti web scritti in linguaggio PHP continuano a utilizzare vecchie versioni, in quanto ancora possibile (anche se non consigliato). **Mantenere aggiornato il codice alla base del sito web** e passare alle nuove versioni di PHP offre diversi vantaggi: nuove funzioni significano più possibilità, la performance può migliorare notevolmente e le falle di sicurezza vengono chiuse.

---

### Provate subito PHP 8!

Provate subito PHP 8! Non siete ancora clienti IONOS? Ordinate ora una delle [vantaggiose offerte di web hosting](https://www.ionos.it/hosting/web-hosting "Web Hosting – IONOS"). In questo modo avrete la possibilità di [modificare la versione di PHP nelle impostazioni del vostro account IONOS](https://www.ionos.it/aiuto/hosting/gestire-la-versione-php-nellarea-clienti/visualizzare-o-modificare-la-versione-di-php/) e aggiornarla a PHP 8 o PHP 8.1 (non appena disponibile).

---

## Utilizzare il codice non aggiornato comporta dei problemi?

Trattandosi PHP 8 di un aggiornamento principale, bisogna rendersi conto che il codice delle versioni precedenti **potrebbe non essere più compatibile**. La maggior parte delle modifiche che potrebbero causare problemi sono però già state apportate nelle versioni [7.2](https://wiki.php.net/rfc/deprecations_php_7_2 "Deprecations di PHP 7.2"), [7.3](https://wiki.php.net/rfc/deprecations_php_7_3 "Deprecations di PHP 7.3") e [7.4](https://wiki.php.net/rfc/deprecations_php_7_4 "Deprecations di PHP 7.4").

Le modifiche attuali sono:

- The *real* type
- Magic quotes legacy
- *array\_key\_exists()* with objects
- *FILTER\_SANITIZE\_MAGIC\_QUOTES* filter
- Reflection *export()* methods
- *mb\_strrpos()* with encoding as 3rd argument
- *implode()* parameter order mix
- Unbinding *$this* from non-static closures
- *hebrevc()* function
- *convert\_cyr\_string()* function
- *money\_format()* function
- *ezmlm\_hash()* function
- *restore\_include\_path()* function
- *allow\_url\_include* ini directive

Chi si è preoccupato di mantenere il proprio codice sempre aggiornato non avrà grandi problemi, nonostante si tratti di una **major release senza modifiche compatibili con le versioni precedenti**. Si può trovare un elenco completo di tutte le modifiche nella [pagina ufficiale del progetto PHP](https://www.php.net/releases/8.0/it.php "php.net: annuncio della release di PHP 8.0.0").

---

### N.B.

Microsoft ha annunciato che l'azienda non offrirà più il supporto di Windows per PHP 8 e versioni successive. Tuttavia, gli sviluppatori di PHP hanno già annunciato la loro intenzione di colmare questa lacuna autonomamente.

---

## Le nuove funzioni di PHP 8

La nuova versione di PHP ha portato con sé alcune novità che offrono molte possibilità aggiuntive agli sviluppatori web. Di seguito abbiamo riassunto per voi le modifiche più importanti rispetto alle versioni precedenti.

---

### N.B.

Il 30 novembre 2020 è stata la data ufficiale di End-of-Life di [PHP 7.2](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/php-72/ "PHP 7.2"), e non è più supportata da allora. Per saperne di più, vedi il nostro articolo su questo argomento.

---

### JIT Compiler

La maggiore novità è il **JIT Compiler**, che dovrebbe migliorare notevolmente le prestazioni. PHP non viene compilato ma interpretato riga per riga. Il compilatore JIT (Just in Time) ha il compito di **compilare parti del codice durante il tempo di esecuzione** (runtime) e funziona in maniera molto simile a una versione cache del codice.

Anche [Pedro Escudero](https://levelup.gitconnected.com/how-fast-is-php-8-going-to-be-f7fdc111cd6 "Rapporto del test effettuato sul compilatore JIT: How fast is PHP-8 going to be?") ha **già testato in maniera convincente** questa nuova funzione di PHP 8. Ha utilizzato un semplice script e comparato le versioni 5.3, 7.4 e 8; quest’ultima con e senza JIT. A questo scopo ha eseguito lo script cento volte per ogni versione e registrato il tempo medio.

Nella seguente tabella abbiamo riportato i valori medi registrati:

<table>
  <thead>
    <tr>
      <th>Versione PHP</th>
      <th>Tempo in secondi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>5.3</td>
      <td>0.64574003219604</td>
    </tr>
    <tr>
      <td>7.4</td>
      <td>0.10253500938416</td>
    </tr>
    <tr>
      <td>8 (senza JIT)</td>
      <td>0.098223924636841</td>
    </tr>
    <tr>
      <td>8 (con JIT)</td>
      <td>0.053637981414795</td>
    </tr>
  </tbody>
</table>

Nonostante non vi sia una gran differenza tra la versione 7.4 e la 8 senza JIT, il discorso cambia con la versione 8 dotata di JIT. Il compilatore JIT assicura un **miglioramento delle prestazioni di oltre il 45%**.

### Union Types

Gli Union Types (o tipi di unione) si conoscono già da altri linguaggi quali C/C++, TypeScript o anche Haskell. Questa funzione permette di autorizzare due o più tipi per unione rendendo possibile l’utilizzo di ognuno di questi. Il codice corrispondente si presenta così:

```none
public function foo(Foo|Bar $input): int|float;
```

Tuttavia c’è una restrizione, in quanto *void* non può diventare parte di un Union Type dato che non restituisce alcun valore. Inoltre le unioni *nullable* possono essere scritte con *|null* o *?*, come nel seguente esempio:

```none
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
```

### Static return type

*Static* è un nome di classi speciale e, nella nuova versione, fa parte dei Return Type validi assieme a *self &amp; parent*.

### WeakMap

I WeakRefs erano già stati aggiunti in PHP 7.4, ora con WeakMaps PHP 8 introduce l’estensione di questa funzione. WeakMaps e WeakRefs possono essere impiegati per cancellare oggetti, qualora solamente la cache faccia riferimento alle classi di entità degli oggetti. Questo porta a un **risparmio di risorse nella gestione degli oggetti**. Un esempio estratto dalla documentazione:

```none
class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...
}
```

### Utilizzare ::class per gli oggetti

Nelle versioni precedenti era necessario utilizzare *get\_class()* per assegnare gli oggetti a una classe. Ora invece è possibile utilizzare *::class* per gli oggetti, lasciando il codice sorgente più leggero.

### Stringable interface

La stringable interface viene aggiunta automaticamente alle classi che implementano il metodo \_\_*toString()*. Finora questo passaggio andava eseguito manualmente. Il codice si presenta quindi nel modo seguente:

```none
class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');
```

### Funzione fdiv()

La nuova funzione *fdiv()* permette di dividere per 0. In risposta si ottengono i valori di ritorno *INF*, *-INF* o *NAN*.

### Type errors (errori di tipo)

Finora solamente alcune funzioni definite dall’utente causavano *TypeErrors*, mentre con le funzioni interne si otteneva un avvertimento e *null* come risultato. A partire da PHP 8 anche le funzioni interne possono restituire errori di tipo.

### Nuova classificazione di engine warnings

Finora ci sono stati molti errori a cui seguiva un avvertimento o un suggerimento. Ora anche questo è stato cambiato. Nella documentazione trovate un [elenco completo di tutti i nuovi avvisi di errori PHP](https://wiki.php.net/rfc/engine_warnings "Elenco ufficiale degli avvisi in PHP").

### Firme corrette dei metodi magici

Nelle versioni precedenti di PHP, era possibile scrivere metodi magici con firme che non corrispondevano alla firma prevista, per esempio *\_\_clone(): float* o *\_\_isset(): Closure*. Dall’introduzione di PHP 7.0, l’uso corretto dei metodi magici è stato controllato solo in modo casuale. Alla nuova versione sono stati aggiunti vari controlli dei parametri e dei valori di ritorno per garantire la correttezza delle firme.

### Reflection

Anche qui le firme della classe Reflection sono state modificate. Originariamente Reflection veniva scritto in questo modo:

```none
ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);
```

In PHP 8 è scritto ora nel seguente modo:

```none
ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);
```

Se si vogliono supportare PHP 7 e PHP 8 in contemporanea, allora è possibile utilizzare il codice seguente:

```none
ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
```

---

### Consiglio

Non avete ancora un vostro sito web? [Web Hosting](https://www.ionos.it/hosting/web-hosting "Web Hosting – IONOS") di IONOS è un servizio di hosting altamente performante e raccomandato anche per i principianti. Inoltre, optando per un [server virtuale](https://www.ionos.it/server/vps "VPS Hosting – Server virtuali per Windows e Linux – IONOS") potete ottenere il più alto livello di flessibilità e le migliori prestazioni possibili. Scegliete l’offerta IONOS che meglio si adatta al vostro progetto.

---


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/php-8/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/php-8/) for AI/LLM consumption.