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. La versione attuale PHP 7 ha portato con sé un’ottimizzazione della velocità influendo positivamente sul ranking dei motori di ricerca. Ma sulla scena si prospetta un nuovo aggiornamento sostanziale: PHP 8.

Recentemente, lo sviluppatore Brent Roose ha condiviso il suo parere riguardo a tutte le nuove funzioni della versione PHP 8. Ma non essendo ancora ultimata la versione finale, a queste potrebbero aggiungersene altre nei prossimi mesi.

Quando verrà rilasciato PHP 8?

Dopo un lungo periodo di incertezza, gli sviluppatori hanno stabilito il 26 novembre 2020 come data di rilascio di PHP 8. Se così fosse, sarebbe confermata la durata del ciclo delle versioni PHP di tre anni. Inoltre, a dicembre 2019 è stato rilasciato PHP 7.4 e interrotto il supporto per PHP 7.1. Tuttavia, molti siti web scritti in linguaggio PHP continuano a utilizzare una vecchia versione, che presto non sarà più supportata.

Mantenere attuale il codice alla base del proprio sito web e utilizzare le versioni aggiornate di PHP offre alcuni vantaggi. Nuove funzioni significano più possibilità, che può tradursi in un aumento massiccio delle performance e la risoluzione delle falle di sicurezza, i cosiddetti bug.

Fatto

Nel frattempo sono comparse le prime versioni alpha di PHP 8. Tuttavia, queste sono pensate a scopo di test e non dovrebbero assolutamente essere integrate in versioni online di siti web o applicazioni.

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 superate nelle versioni 7.2, 7.3 e 7.4.

Le modifiche confermate fino ad ora 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 verso il basso. Un elenco completo di tutte le modifiche lo si può trovare nelle note di aggiornamento su GitHub.

N.B.

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

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.

JIT Compiler

La maggiore novità sarà il JIT Compiler, il quale dovrebbe migliorare sensibilmente le performance. PHP non sarà compilato ma interpretato riga per riga. Il JIT Compiler (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 “cachata” (da cache) del codice. Il risultato dovrebbe essere un miglioramento massiccio delle prestazioni.

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 100 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 JIT Compiler assicura un miglioramento delle prestazioni di oltre il 45%.

Estensione JSON sempre attiva

Nelle versioni precedenti del linguaggio di scripting, l'estensione JSON poteva essere disattivata opzionalmente. Ma poiché JSON è un formato di dati così importante, gli sviluppatori PHP hanno deciso di lasciare l'estensione sempre attiva. Si presume che questo semplifichi il lavoro con PHP.

Union Types

Gli Union Types (o tipi unione) si conoscono già da altri linguaggi quali C/C++, TypeScrip o anche Haskell. Questa funzione permette di autorizzare due o più tipi per una unione rendendo possibile l’utilizzo di ognuno di questi. Il codice corrispondente appare 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

In PHP 7.4 erano già stati aggiunti i WeakRefs, ora con WeakMaps si ha l’estensione di questa funzione di recente introduzione. WeakMaps e WeakRefs possono essere impiegati per cancellare oggetti, qualora solamente la cache fa riferimento alle classi di entità degli oggetti. Questo porta a una gestione degli oggetti meno incidente sull’utilizzo delle risorse. Un esempio estratto dalla documentazione:

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

Utilizzare ::class sugli oggetti

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

Stringable interface

La stringable interface implementa automaticamente un’interfaccia. Fino ad ora questo passaggio andava eseguito manualmente. L’implementazione può riguardare tutte le stringhe o solamente dove presente __toString(). Il codice apparirà così:

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

Convertire DateTime

PHP 8 rende significativamente più facile la conversione di DateTime. Gli sviluppatori hanno aggiunto DateTime::createFromInterface() und DatetimeImmutable::createFromInterface(). Grazie a ciò è finalmente possibile convertire l’uno nell’altro DateTime e DateTimeImmutable.

fdiv

fdiv permette di dividere per 0. In risposta si ottengono i valori INF, -INF o NAN.

Type annotations

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

Type errors

Fino ad ora 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 dare TypeErrors.

Reclassified engine warnings

Nella versione attuale sono molti gli errori a cui seguiva un avvertimento o un suggerimento. Anche questo è stato cambiato. Nella documentazione trovate un elenco completo di tutti i nuovi avvisi di errori PHP.

Default error reporting level

Gli errori ignorati fino a questo momento, in futuro daranno come risultato E_ALL, E_NOTICE e E_DEPRECATED. Questi errori esistevano già anche nelle versioni precedenti alla 8, tuttavia non erano segnalati apertamente.

@ non sopprimerà più i fatal error

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.

Sequenza degli operatori di concatenazione

Già introdotta in PHP 7.4, con la nuova versione entra a pieno regime. PHP reagisce in maniera migliore quando più operatori operano contemporaneamente. Il seguente codice serve da esempio:

echo "sum: " . $a + $b;

fino ad ora veniva interpretato come

echo ("sum: " . $a) + $b;

e con PHP 8 diventa

echo "sum: " . ($a + $b);

Reflection

Anche qui cambia la scrittura del codice. Originariamente Reflection veniva scritto in questo modo:

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

In PHP 8 sarà scritto così:

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

Se si vogliono supportare PHP 7 e PHP 8 in contemporanea, allora il codice sarà il seguente:

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

Queste sono le funzioni che sono sicuramente introdotte in PHP 8 finora. Tuttavia è lecito aspettarsi ulteriori novità da qui alla data di rilascio.


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.