PHP 8: tutte le informazioni sul nuovo aggiornamento

PHP è un linguaggio di programmazione tra i più facili da imparare. Con un tutorial e la giusta motivazione, in poche ore si può già apprendere a scrivere i primi codici ed eseguire i primi comandi. PHP 7 ha portato con sé un’ottimizzazione della velocità influendo positivamente sul ranking nei motori di ricerca. Ora il linguaggio open source ha ricevuto un importante aggiornamento alla versione 8.0.

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 venisse interrotto. Anche il supporto per PHP 7.2 terminerà 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!

Non siete ancora clienti IONOS? Ordinate ora una delle vantaggiose offerte di web hosting. Successivamente potete cambiare la versione PHP in uso dall'area clienti di IONOS e passare alla versione beta di PHP 8.

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, 7.3 e 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.

Le nuove funzioni di PHP 8

La nuova versione di PHP porta appositamente 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.

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 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:

Versione PHP Tempo in secondi
5.3 0.64574003219604
7.4 0.10253500938416
8 (senza JIT) 0.098223924636841
8 (con JIT) 0.053637981414795

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ì:

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:

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 & 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:

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:

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 annotations (annotazioni di tipo)

Nella nuova versione vengono aggiunte le annotazioni di tipo per tutti i metodi e le funzioni interni.

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.

@ non sopprimerà più i fatal errors

Anche questa nuova funzione permette di individuare gli errori. Invece di sopprimere gli errori ricorrendo all’operatore di controllo @, è sufficiente assicurarsi di aver configurato display_errors=Offsul server.

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:

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

In PHP 8 è scritto ora nel seguente modo:

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:

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

Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.