PHP è un lin­guag­gio di pro­gram­ma­zio­ne tra i più facili da imparare. Con un tutorial e la giusta mo­ti­va­zio­ne, in poche ore si può già ap­pren­de­re a scrivere i primi codici ed eseguire i primi comandi. PHP 7 ha portato con sé un’ot­ti­miz­za­zio­ne della velocità influendo po­si­ti­va­men­te sul ranking nei motori di ricerca. Ora ilIl lin­guag­gio open source ha ricevuto un im­por­tan­te ag­gior­na­men­to alla versione 8.0, a cui è seguito dopo un anno un ag­gior­na­men­to minore alla versione più recente, la 8.1.

Quali sono le ca­rat­te­ri­sti­che di PHP 8.1?

PHP 8.1 è stato ri­la­scia­to in versione beta ed è at­tual­men­te in fase di test. L'ag­gior­na­men­to finale arriverà a novembre 2021, ma le nuove ca­rat­te­ri­sti­che sono già note. Ecco di quali novità si parla:

  • Enum: le co­sid­det­te Enu­me­ra­tions (enu­me­ra­zio­ni con un certo numero di valori) sono ora di­spo­ni­bi­li come tipo di variabile.
  • Fibers: la nuova tipologia di code block Fibers vi dà la pos­si­bi­li­tà di eseguire diversi thread di programma in parallelo.
  • Arrays: a partire da PHP 7.4, è possibile scom­pat­ta­re gli array con valori numerici. Ora questo è possibile anche per gli array con stringhe.
  • Readonly: d'ora in poi, le proprietà delle classi possono essere marcate come 'rea­don­ly' e quindi non sono più mo­di­fi­ca­bi­li.
  • In­ter­sec­tion: i tipi di in­ter­se­zio­ne (fon­da­men­tal­men­te le con­tro­par­ti dei tipi di unione) sono ora di­spo­ni­bi­li.
  • Never: il nuovo valore di ritorno 'never' indica che una funzione è terminata e non re­sti­tui­sce nessun altro valore.
  • Final: ora potete marcare le costanti di classe con 'final' in modo che non possano essere cambiate dalle sot­to­clas­si.
  • Fsync: PHP 8.1 introduce le due funzioni 'fsync' e 'f­da­ta­sync' per sin­cro­niz­za­re i dati dal buffer al supporto di me­mo­riz­za­zio­ne.
  • Octal: per vi­sua­liz­za­re il sistema numerico ottale, oltre a '0' (zero), si potrà uti­liz­za­re anche il prefisso '0o' (zero e O minuscola).
  • Globals: l'uso di '$GLOBALS' è stato leg­ger­men­te limitato e ora porta in alcuni casi a un messaggio di errore.
  • Null: le funzioni interne non accettano più valori nulli per argomenti non an­nul­la­bi­li.
N.B.

Questa è solo una selezione dei cam­bia­men­ti più in­te­res­san­ti in PHP 8.1. Molte delle altre nuove fun­zio­na­li­tà pia­ni­fi­ca­te possono essere trovate nel Wiki ufficiale con tutte le Request for Comments.

PHP 8: ri­la­scia­to a novembre 2020

Il 26 novembre 2020 è arrivato ed è stata ri­la­scia­ta l’ultima versione del popolare lin­guag­gio di scripting, PHP 8. È stata così con­fer­ma­ta la durata del ciclo delle versioni PHP di tre anni. Il pre­ce­den­te PHP 7.4 è stato attivo circa un anno, prima che il supporto per PHP 7.1 venisse in­ter­rot­to. Anche il supporto per PHP 7.2 è terminato alla fine del 2020.

Tuttavia, molti siti web scritti in lin­guag­gio PHP con­ti­nua­no a uti­liz­za­re vecchie versioni, in quanto ancora possibile (anche se non con­si­glia­to). Mantenere ag­gior­na­to il codice alla base del sito web e passare alle nuove versioni di PHP offre diversi vantaggi: nuove funzioni si­gni­fi­ca­no più pos­si­bi­li­tà, la per­for­man­ce può mi­glio­ra­re no­te­vol­men­te e le falle di sicurezza vengono chiuse.

Provate subito PHP 8!

Provate subito PHP 8! Non siete ancora clienti IONOS? Ordinate ora una delle van­tag­gio­se offerte di web hosting. In questo modo avrete la pos­si­bi­li­tà di mo­di­fi­ca­re la versione di PHP nelle im­po­sta­zio­ni del vostro account IONOS e ag­gior­nar­la a PHP 8 o PHP 8.1 (non appena di­spo­ni­bi­le).

Uti­liz­za­re il codice non ag­gior­na­to comporta dei problemi?

Trat­tan­do­si PHP 8 di un ag­gior­na­men­to prin­ci­pa­le, bisogna rendersi conto che il codice delle versioni pre­ce­den­ti potrebbe non essere più com­pa­ti­bi­le. La maggior parte delle modifiche che po­treb­be­ro 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
  • Re­flec­tion 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 è pre­oc­cu­pa­to di mantenere il proprio codice sempre ag­gior­na­to non avrà grandi problemi, no­no­stan­te si tratti di una major release senza modifiche com­pa­ti­bi­li con le versioni pre­ce­den­ti. Si può trovare un elenco completo di tutte le modifiche nella pagina ufficiale del progetto PHP.

N.B.

Microsoft ha an­nun­cia­to che l'azienda non offrirà più il supporto di Windows per PHP 8 e versioni suc­ces­si­ve. Tuttavia, gli svi­lup­pa­to­ri di PHP hanno già an­nun­cia­to la loro in­ten­zio­ne di colmare questa lacuna au­to­no­ma­men­te.

Le nuove funzioni di PHP 8

La nuova versione di PHP ha portato con sé alcune novità che offrono molte pos­si­bi­li­tà ag­giun­ti­ve agli svi­lup­pa­to­ri web. Di seguito abbiamo riassunto per voi le modifiche più im­por­tan­ti rispetto alle versioni pre­ce­den­ti.

N.B.

Il 30 novembre 2020 è stata la data ufficiale di End-of-Life di PHP 7.2, e non è più sup­por­ta­ta da allora. Per saperne di più, vedi il nostro articolo su questo argomento.

JIT Compiler

La maggiore novità è il JIT Compiler, che dovrebbe mi­glio­ra­re no­te­vol­men­te le pre­sta­zio­ni. PHP non viene compilato ma in­ter­pre­ta­to riga per riga. Il com­pi­la­to­re JIT (Just in Time) ha il compito di compilare parti del codice durante il tempo di ese­cu­zio­ne (runtime) e funziona in maniera molto simile a una versione cache del codice.

Anche Pedro Escudero ha già testato in maniera con­vin­cen­te questa nuova funzione di PHP 8. Ha uti­liz­za­to 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 re­gi­stra­to il tempo medio.

Nella seguente tabella abbiamo riportato i valori medi re­gi­stra­ti:

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

No­no­stan­te non vi sia una gran dif­fe­ren­za tra la versione 7.4 e la 8 senza JIT, il discorso cambia con la versione 8 dotata di JIT. Il com­pi­la­to­re JIT assicura un mi­glio­ra­men­to delle pre­sta­zio­ni di oltre il 45%.

Union Types

Gli Union Types (o tipi di unione) si conoscono già da altri linguaggi quali C/C++, Ty­pe­Script o anche Haskell. Questa funzione permette di au­to­riz­za­re due o più tipi per unione rendendo possibile l’utilizzo di ognuno di questi. Il codice cor­ri­spon­den­te si presenta così:

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

Tuttavia c’è una re­stri­zio­ne, in quanto void non può diventare parte di un Union Type dato che non re­sti­tui­sce 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’esten­sio­ne di questa funzione. WeakMaps e WeakRefs possono essere impiegati per can­cel­la­re oggetti, qualora solamente la cache faccia ri­fe­ri­men­to alle classi di entità degli oggetti. Questo porta a un risparmio di risorse nella gestione degli oggetti. Un esempio estratto dalla do­cu­men­ta­zio­ne:

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

Uti­liz­za­re ::class per gli oggetti

Nelle versioni pre­ce­den­ti era ne­ces­sa­rio uti­liz­za­re get_class() per assegnare gli oggetti a una classe. Ora invece è possibile uti­liz­za­re ::class per gli oggetti, lasciando il codice sorgente più leggero.

Strin­ga­ble interface

La strin­ga­ble interface viene aggiunta au­to­ma­ti­ca­men­te alle classi che im­ple­men­ta­no il metodo __toString(). Finora questo passaggio andava eseguito ma­nual­men­te. 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 errors (errori di tipo)

Finora solamente alcune funzioni definite dall’utente causavano Ty­peEr­rors, mentre con le funzioni interne si otteneva un av­ver­ti­men­to e null come risultato. A partire da PHP 8 anche le funzioni interne possono re­sti­tui­re errori di tipo.

Nuova clas­si­fi­ca­zio­ne di engine warnings

Finora ci sono stati molti errori a cui seguiva un av­ver­ti­men­to o un sug­ge­ri­men­to. Ora anche questo è stato cambiato. Nella do­cu­men­ta­zio­ne trovate un elenco completo di tutti i nuovi avvisi di errori PHP.

Firme corrette dei metodi magici

Nelle versioni pre­ce­den­ti di PHP, era possibile scrivere metodi magici con firme che non cor­ri­spon­de­va­no alla firma prevista, per esempio __clone(): float o __isset(): Closure. Dall’in­tro­du­zio­ne di PHP 7.0, l’uso corretto dei metodi magici è stato con­trol­la­to solo in modo casuale. Alla nuova versione sono stati aggiunti vari controlli dei parametri e dei valori di ritorno per garantire la cor­ret­tez­za delle firme.

Re­flec­tion

Anche qui le firme della classe Re­flec­tion sono state mo­di­fi­ca­te. Ori­gi­na­ria­men­te Re­flec­tion 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 sup­por­ta­re PHP 7 e PHP 8 in con­tem­po­ra­nea, allora è possibile uti­liz­za­re il codice seguente:

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 di IONOS è un servizio di hosting altamente per­for­man­te e rac­co­man­da­to anche per i prin­ci­pian­ti. Inoltre, optando per un server virtuale potete ottenere il più alto livello di fles­si­bi­li­tà e le migliori pre­sta­zio­ni possibili. Scegliete l’offerta IONOS che meglio si adatta al vostro progetto.

Vai al menu prin­ci­pa­le