{"id":36752,"date":"2020-05-26T05:39:20","date_gmt":"2020-05-26T12:39:20","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-02-01T15:10:12","modified_gmt":"2023-02-01T14:10:12","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/php-8\/","title":{"rendered":"Cosa C&#8217;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)"},"content":{"rendered":"<p>PHP 8 \u00e8 stato ufficialmente rilasciato alla General Availability lo scorso 26 novembre 2020.<\/p>\n<p>Questo nuovo importante aggiornamento porta tutta una serie di ottimizzazioni e potenti funzionalit\u00e0 al linguaggio e siamo felici di illustrarvi i cambiamenti pi\u00f9 interessanti che ci permetteranno di scrivere codice migliore e costruire applicazioni pi\u00f9 potenti.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84636\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8 released\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/it.php\">PHP 8.0 Announcement Addendum<\/a><\/figcaption><\/figure>\n<p>Siete pronti? Cominciamo!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (Just in Time Compiler)<\/h2>\n<p>La funzionalit\u00e0 pi\u00f9 acclamata in arrivo con PHP 8 \u00e8 il <strong>Compiler Just-in-time (JIT)<\/strong>. Ma cos&#8217;\u00e8 JIT?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">La proposta dell&#8217;RFC<\/a> descrive JIT come segue:<\/p>\n<blockquote><p>&#8220;PHP JIT \u00e8 implementato come parte quasi indipendente di OPcache. Pu\u00f2 essere abilitato\/disabilitato al momento della compilazione di PHP e al run-time. Quando \u00e8 abilitato, il codice nativo dei file PHP \u00e8 memorizzato in una regione aggiuntiva della memoria condivisa di OPcache e gli op_array\u2192opcodes[].handler(s) mantengono i puntatori sugli entry points del codice JIT.&#8221;<\/p><\/blockquote>\n<p>Allora, come siamo arrivati a JIT e qual \u00e8 la differenza tra JIT e OPcache?<\/p>\n<p>Per capire meglio cos&#8217;\u00e8 JIT per PHP, diamo una rapida occhiata a come viene eseguito\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-php\/\">PHP<\/a> dal codice sorgente fino al risultato finale.<\/p>\n<p>L&#8217;esecuzione di PHP consiste in una procedura in 4 fasi:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenizing<\/strong>: per prima cosa, l&#8217;interprete legge il codice PHP e costruisce un set di token.<\/li>\n<li><strong>Parsing<\/strong>: l&#8217;interprete controlla se lo script corrisponde alle regole della sintassi e utilizza i token per costruire un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">Abstract Syntax Tree<\/a> (AST), che \u00e8 <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">una rappresentazione gerarchica della struttura del codice sorgente<\/a>.<\/li>\n<li><strong>Compilation<\/strong>: l&#8217;interprete attraversa l&#8217;albero e traduce i nodi AST in Zend opcode di basso livello, che sono identificatori numerici che determinano il tipo di <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">istruzione eseguita dalla Zend VM<\/a>.<\/li>\n<li><strong>Interpretation<\/strong>: gli opcode vengono interpretati ed eseguiti sulla Zend VM.<\/li>\n<\/ul>\n<p>L&#8217;immagine che segue mostra una rappresentazione visuale della procedura di esecuzione di base di PHP.<\/p>\n<figure id=\"attachment_73105\" aria-describedby=\"caption-attachment-73105\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73105 size-full\" src=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/processo-esecuzione-base-php.png\" alt=\"Procedura di esecuzione di base di PHP\" width=\"1100\" height=\"1460\"><figcaption id=\"caption-attachment-73105\" class=\"wp-caption-text\">Procedura di esecuzione di base di PHP<\/figcaption><\/figure>\n<p>Allora, in che modo OPcache rende PHP pi\u00f9 veloce? E cosa cambia nella procedura di esecuzione con JIT?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"the-opcache-extension\">L&#8217;Estensione OPcache<\/h3>\n<p>PHP \u00e8 un linguaggio interpretato. Ci\u00f2 significa che, quando viene eseguito uno script PHP, l&#8217;interprete analizza, compila ed esegue il codice pi\u00f9 e pi\u00f9 volte ad ogni richiesta. Ci\u00f2 pu\u00f2 comportare uno <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">spreco di risorse della CPU<\/a>\u00a0e di tempo aggiuntivo.<\/p>\n<p>Qui entra in gioco l&#8217;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">estensione OPcache<\/a>:<\/p>\n<blockquote><p>&#8220;OPcache migliora le prestazioni di PHP memorizzando il bytecode degli script precompilati nella memoria condivisa, eliminando cos\u00ec la necessit\u00e0 per PHP di caricare e analizzare gli script ad ogni richiesta.&#8221;<\/p><\/blockquote>\n<p>Con OPcache abilitato, l&#8217;interprete PHP attraversa la procedura a 4 fasi di cui sopra solo la prima volta che lo script viene eseguito. Dato che i bytecode PHP sono memorizzati nella memoria condivisa, sono immediatamente disponibili come rappresentazione intermedia di basso livello e possono essere eseguiti subito sulla Zend VM.<\/p>\n<figure id=\"attachment_73080\" aria-describedby=\"caption-attachment-73080\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73080 size-full\" src=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/processo-esecuzione-php-opcache-abilitata.png\" alt=\"Procedura di esecuzione PHP con OPcache abilitata\" width=\"1100\" height=\"1560\"><figcaption id=\"caption-attachment-73080\" class=\"wp-caption-text\">Procedura di esecuzione di PHP con OPcache abilitata<\/figcaption><\/figure>\n<p>A partire da PHP 5.5, l&#8217;estensione Zend OPcache \u00e8 disponibile di default e si pu\u00f2 verificare se questa \u00e8 configurata correttamente semplicemente\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/phpinfo\/\">invocando <code>phpinfo()<\/code><\/a> da uno script sul proprio server o controllando il file php.ini (si vedano le\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">impostazioni di configurazione di OPcache<\/a>).<\/p>\n<figure id=\"attachment_73106\" aria-describedby=\"caption-attachment-73106\" style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-73106 size-full\" src=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/zend-sezione-opcache-pagina-phpinfo.jpg\" alt=\"Sezione Zend OPcache in una pagina phpinfo\" width=\"1926\" height=\"992\"><figcaption id=\"caption-attachment-73106\" class=\"wp-caption-text\">Sezione Zend OPcache in una pagina phpinfo<\/figcaption><\/figure>\n<h3 id=\"preloading\">Preloading<\/h3>\n<p>OPcache \u00e8 stata recentemente migliorata con l&#8217;implementazione del <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">preloading<\/a>, una nuova funzionalit\u00e0 di OPcache aggiunta con\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/\">PHP 7.4<\/a>. Il preloading fornisce un modo per memorizzare un insieme specifico di script nella memoria di OPcache &#8220;<i>prima che venga eseguito qualsiasi codice applicativo<\/i>&#8220;, ma non porta un miglioramento tangibile delle prestazioni per le tipiche applicazioni basate sul web.<\/p>\n<p>Potete leggere di pi\u00f9 sul precaricamento nella <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#preloading\">nostra introduzione a PHP 7.4<\/a>.<\/p>\n<p>Con JIT, PHP fa un passo avanti.<\/p>\n<h3 id=\"jit--the-just-in-time-compiler\">JIT \u2014 Just in Time Compiler<\/h3>\n<p>Anche se gli opcode sono sotto forma di rappresentazione intermedia di basso livello, devono comunque essere compilati in codice macchina. JIT &#8220;non introduce alcuna forma aggiuntiva di rappresentazione intermedia (IR &#8211; Intermediate Representation)&#8221;, ma utilizza\u00a0<a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Dynamic Assembler for code generation engines) per generare codice nativo direttamente dal byte-code PHP.<\/p>\n<p>In breve, <strong>JIT traduce le parti calde del codice intermedio in codice macchina<\/strong>. Bypassando la compilazione, \u00e8 in grado di apportare notevoli miglioramenti nelle prestazioni e nell&#8217;utilizzo della memoria.<\/p>\n<p>Zeev Surasky, co-autore della proposta di PHP JIT, mostra quanto sarebbero pi\u00f9 veloci i calcoli con JIT:<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Ma JIT pu\u00f2 migliorare davvero le\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/prestazioni-wordpress\/\">prestazioni di WordPress<\/a>?<\/p>\n<h3 id=\"jit-for-live-web-apps\">JIT per le Live Web Apps<\/h3>\n<p>Secondo l&#8217;RFC di JIT, l&#8217;implementazione del compilatore just in time dovrebbe migliorare le prestazioni di PHP. Ma sperimenteremo davvero tali miglioramenti in applicazioni reali come WordPress?<\/p>\n<p>I primi test mostrano che JIT renderebbe molto pi\u00f9 veloci i carichi di lavoro ad alta intensit\u00e0 di CPU, <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">tuttavia, avverte l&#8217;RFC<\/a>:<\/p>\n<blockquote><p>&#8220;&#8230; come i precedenti tentativi &#8211; attualmente non sembra migliorare significativamente le applicazioni reali come WordPress (con opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Si prevede uno sforzo ulteriore per migliorare JIT per le applicazioni real-life, utilizzando profilazione e ottimizzazioni speculative&#8221;.<\/p><\/blockquote>\n<p>Con JIT abilitato, il codice non verrebbe eseguito dalla Zend VM, ma dalla CPU stessa, e questo migliorerebbe la velocit\u00e0 di calcolo. Le applicazioni web come\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-wordpress\/\">WordPress<\/a> si basano anche su altri fattori come\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/ttfb\/\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/it\/blog\/riparare-il-database-di-wordpress\/\">ottimizzazione del database<\/a>, <a href=\"https:\/\/kinsta.com\/it\/impara\/http2\/\">richieste HTTP<\/a>, ecc.<\/p>\n<figure id=\"attachment_84635\" aria-describedby=\"caption-attachment-84635\" style=\"width: 1884px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84635\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-performance-diagram.png\" alt=\"PHP 8 performance diagram\" width=\"1884\" height=\"1206\"><figcaption id=\"caption-attachment-84635\" class=\"wp-caption-text\">Contributo relativo di JIT alla performance di PHP (origine immagine: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a>)<\/figcaption><\/figure>\n<p>Quindi, per quel che riguarda WordPress e applicazioni simili, non dovremmo aspettarci un grande incremento della velocit\u00e0 di esecuzione di PHP. Tuttavia, JIT potrebbe portare diversi benefici agli <a href=\"https:\/\/kinsta.com\/it\/blog\/retribuzione-web-developer\/\">sviluppatori<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">Secondo Nikita Popov<\/a>:<\/p>\n<blockquote><p>&#8220;I vantaggi del compilatore JIT sono grossomodo (e come gi\u00e0 delineato nell&#8217;RFC):<\/p>\n<ul>\n<li>Prestazioni significativamente migliori per il codice numerico.<\/li>\n<li>Prestazioni leggermente migliori per il &#8220;tipico&#8221; codice di applicazioni web PHP.<\/li>\n<li>La possibilit\u00e0 di spostare pi\u00f9 codice da C a PHP, perch\u00e9 PHP sar\u00e0 ora sufficientemente veloce&#8221;.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Cos\u00ec, anche se JIT difficilmente porter\u00e0 enormi miglioramenti alle prestazioni di WordPress, porter\u00e0 PHP al livello successivo, permettendo di scrivere funzioni direttamente nel linguaggio.<\/p>\n<p>Il lato negativo, tuttavia, sarebbe la maggiore complessit\u00e0 che potrebbe portare ad un aumento dei costi di <a href=\"https:\/\/kinsta.com\/it\/blog\/manutenzione-wordpress\/\">manutenzione<\/a>, stabilit\u00e0 e <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-debug\/\">debugging<\/a>. Secondo Dmitry Stogov:<\/p>\n<blockquote><p>&#8220;JIT \u00e8 estremamente semplice, ma in ogni caso aumenta il livello generale di complessit\u00e0 di PHP, comporter\u00e0 rischi di nuovi tipi di bug e costi di sviluppo e manutenzione&#8221;.<\/p><\/blockquote>\n<p>La proposta di includere JIT in PHP 8 \u00e8 passata con 50 voti favorevoli e 2 contrari.<\/p>\n\n<h2 id=\"php-8-improvements-and-new-features\">PHP 8: Miglioramenti e Nuove Funzionalit\u00e0<\/h2>\n<p>Oltre a JIT, con il rilascio di PHP 8 possiamo aspettarci molte altre funzionalit\u00e0 e miglioramenti. L&#8217;elenco che segue \u00e8 la nostra selezione delle prossime aggiunte e modifiche che dovrebbero rendere PHP pi\u00f9 affidabile ed efficiente.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"17\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Constructor Property Promotion<\/h3>\n<p>Come risultato di una discussione in corso su come migliorare <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">l&#8217;ergonomia degli oggetti in PHP<\/a>, la <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">Constructor Property Promotion RFC<\/a> propone una nuova e pi\u00f9 concisa sintassi che semplifica la dichiarazione delle propriet\u00e0, rendendola pi\u00f9 breve e meno ridondante.<\/p>\n<p>Questa proposta si riferisce solo ai <strong>promoted parameters<\/strong>, cio\u00e8 quei parametri di metodo preceduti dalle visibility keyword <strong>public<\/strong>, <strong>protected<\/strong> e <strong>private<\/strong>.<\/p>\n<p>Attualmente, tutte le propriet\u00e0 devono essere ripetute pi\u00f9 volte (almeno quattro volte) prima di poter essere utilizzate con gli oggetti. Si consideri il seguente esempio riportato sull&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/pre>\n<p>Secondo Nikita Popov, l&#8217;autore della RFC, dobbiamo scrivere il nome della propriet\u00e0 almeno quattro volte in tre posti diversi: la dichiarazione della propriet\u00e0, i parametri del costruttore e l&#8217;assegnazione della propriet\u00e0. Questa sintassi non \u00e8 particolarmente usabile, soprattutto nelle classi con un buon numero di propriet\u00e0 e nomi pi\u00f9 descrittivi.<\/p>\n<p>Questa RFC propone di unire il costruttore e la definizione dei parametri. Cos\u00ec, a partire da PHP 8, abbiamo un modo pi\u00f9 usabile di dichiarare i parametri e il codice visto sopra pu\u00f2 cambiare come mostrato di seguito:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/pre>\n<p>E questo \u00e8 tutto. Cos\u00ec abbiamo un nuovo modo di promuovere le propriet\u00e0 che \u00e8 pi\u00f9 breve, pi\u00f9 leggibile e meno soggetto a errori. <a href=\"https:\/\/phpinternals.news\/53\">Secondo Nikita<\/a>:<\/p>\n<blockquote><p>\u00c8 una semplice trasformazione sintattica che stiamo facendo. Ma questo riduce la quantit\u00e0 di codice boilerplate che si deve scrivere, in particolare per gli oggetti di valore&#8230;<\/p><\/blockquote>\n<p>La dichiarazione di propriet\u00e0 viene trasformata come se avessimo dichiarato esplicitamente tali propriet\u00e0 e possiamo utilizzare la <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">Reflection API<\/a> per effettuare un&#8217;analisi introspettiva delle definizioni delle propriet\u00e0 prima dell&#8217;esecuzione (si veda <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>La Reflection (e altri meccanismi di introspezione) osserver\u00e0 lo stato dopo il desugaring. Ci\u00f2 significa che le propriet\u00e0 promosse appariranno allo stesso modo delle propriet\u00e0 dichiarate esplicitamente, e gli argomenti del costruttore promosso appariranno come argomenti ordinari del costruttore.<\/p><\/blockquote>\n<pre><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/pre>\n<h4>Ereditariet\u00e0<\/h4>\n<p>Non abbiamo alcuna limitazione nell&#8217;utilizzo dell&#8217;ereditariet\u00e0 con la promozione dei parametri. In ogni caso, non c&#8217;\u00e8 una relazione particolare tra i costruttori di classi genitori e classi figlie. <a href=\"https:\/\/phpinternals.news\/53\">Secondo Nikita<\/a>:<\/p>\n<blockquote><p>Di solito, diciamo che i metodi devono sempre essere compatibili con il metodo della classe genitore. [&#8230;] ma questa regola non vale per il costruttore. Quindi il costruttore appartiene realmente ad una singola classe, e non deve esserci in alcun modo compatibilit\u00e0 tra i costruttori della classe genitore e della classe figlia.<\/p><\/blockquote>\n<p>Ecco un esempio:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/pre>\n<h4>Cosa Non \u00c8 Consentito con la Promozione delle Propriet\u00e0<\/h4>\n<p>Le propriet\u00e0 promosse sono consentite nei costruttori non astratti e nei trait, ma ci sono diverse limitazioni che vale la pena menzionare.<\/p>\n<h5>Costruttori Astratti<\/h5>\n<p>Le propriet\u00e0 promosse non sono ammesse nelle classi astratte e nelle interfacce:<\/p>\n<pre><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/pre>\n<h5>Nullability<\/h5>\n<p>Uno dei vincoli maggiori \u00e8 legato alla nullability. In precedenza, quando si utilizzava un tipo che non era esplicitamente nullable, ma con un valore predefinito nullo, il tipo era implicitamente nullable. Ma con i property type, non abbiamo questo comportamento implicito perch\u00e9 i parametri promossi richiedono una dichiarazione di propriet\u00e0, e il tipo nullable deve essere dichiarato esplicitamente. Si veda l&#8217;esempio seguente riportato nella RFC:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/pre>\n<h5>Tipo Callable<\/h5>\n<p>Dato che callable non \u00e8 un <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#typed-properties\">tipo supportato per le propriet\u00e0<\/a>, non ci \u00e8 permesso utilizzare il tipo callable nella promozione dei parametri:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>La Keyword var Non \u00c8 Ammessa<\/h5>\n<p>Solo una visibility keyword pu\u00f2 essere utilizzata con i parametri promossi, quindi non \u00e8 consentito dichiarare le propriet\u00e0 del costruttore con la parola chiave <code>var<\/code> (si veda il seguente esempio della RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>Non Sono Ammesse Duplicazioni<\/h5>\n<p>Possiamo combinare propriet\u00e0 promosse e propriet\u00e0 esplicite nella stessa classe, ma le propriet\u00e0 non possono essere dichiarate due volte:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/pre>\n<h5>I Parametri Variadici Non Sono Ammessi<\/h5>\n<p>Il motivo \u00e8 che il tipo dichiarato \u00e8 diverso dal parametro variadico, che \u00e8 in realt\u00e0 un array:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Ulteriori Letture<\/h4>\n<p>Per una discussione approfondita della Costructor Property Promotion, ascoltate questa <a href=\"https:\/\/phpinternals.news\/53\">intervista a Nikita Popov<\/a>. Per una panoramica approfondita dell&#8217;ergonomia degli oggetti in PHP, si veda <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">questo articolo<\/a> e la successiva <a href=\"https:\/\/phpinternals.news\/51\">intervista a Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Validazione per i Metodi Astratti dei Trait<\/h3>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">I Trait<\/a> sono definiti come &#8220;un meccanismo per il riutilizzo del codice in linguaggi a <em>single inheritance<\/em> come PHP&#8221;. Sono utilizzati per dichiarare metodi che possono essere usati in pi\u00f9 classi.<\/p>\n<p>Un trait pu\u00f2 anche contenere metodi astratti. Questi metodi si limitano a dichiarare la firma del metodo, ma l&#8217;implementazione deve essere fatta all&#8217;interno della classe che utilizza il trait.<\/p>\n<p>Secondo il\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">manuale PHP<\/a>,<\/p>\n<blockquote><p>&#8220;I trait supportano l&#8217;utilizzo di metodi astratti per imporre requisiti alla classe che li espone&#8221;.<\/p><\/blockquote>\n<p>Ci\u00f2 significa anche che le firme dei metodi devono corrispondere. In altre parole, il tipo e il numero di argomenti richiesti\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\">devono essere gli stessi<\/a>.<\/p>\n<p>Ad ogni modo, <a href=\"https:\/\/externals.io\/message\/108065#108164\">secondo Nikita Popov<\/a>, autore dell&#8217;RFC, la convalida della firma \u00e8 attualmente applicata solo in modo irregolare:<\/p>\n<blockquote>\n<ul>\n<li>Non \u00e8 applicata nel caso pi\u00f9 comune, dove l&#8217;implementazione del metodo \u00e8 fornita dalla classe utilizzatrice:\u00a0<a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>Si applica se l&#8217;implementazione proviene da una classe genitore:\u00a0<a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>Si applica se l&#8217;implementazione proviene da una classe figlio:\u00a0<a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<\/blockquote>\n<p>Il seguente esempio di Nikita si riferisce al primo caso (firma non forzata):<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Detto questo, <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">questa RFC<\/a> propone di emettere sempre un errore fatale se il metodo che implementa non \u00e8 compatibile con il metodo astratto del trait, indipendentemente dalla sua origine:<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Questa RFC \u00e8 stato approvato all&#8217;unanimit\u00e0.<\/p>\n<h3 id=\"incompatible-method-signatures\">Firme di Metodi Incompatibili<\/h3>\n<p>In PHP, gli errori di ereditariet\u00e0 dovuti a firme di metodi incompatibili generano o un errore fatale o un warning a seconda di ci\u00f2 che causa l&#8217;errore.<\/p>\n<p>Se una classe sta implementando un&#8217;interfaccia, le firme dei metodi incompatibili generano un errore fatale. Secondo la\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">documentazione delle Object Interface<\/a>:<\/p>\n<blockquote><p>&#8220;La classe che implementa l&#8217;interfaccia deve utilizzare una firma di metodo compatibile con l&#8217;LSP (Principio di Sostituzione di Liskov). Se non lo fa, si otterr\u00e0 un errore fatale.&#8221;<\/p><\/blockquote>\n<p>Ecco un esempio di <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">errore di ereditariet\u00e0 con un&#8217;interfaccia<\/a>:<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4, il codice di cui sopra avrebbe generato il seguente errore:<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Una funzione in una <em>child class<\/em> con una firma incompatibile genererebbe un warning. Si consideri il seguente codice tratto dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>In PHP 7.4, il codice qui sopra non farebbe altro che generare un avviso:<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Ora, <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">questa RFC<\/a> propone di emettere sempre un errore fatale per le firme di metodo incompatibili. Con PHP 8, il codice che abbiamo visto in precedenza visualizzerebbe quanto segue:<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Array che Iniziano con un Indice Negativo<\/h3>\n<p>In PHP, se un array inizia con un indice negativo (<code>start_index &lt; 0<\/code>), gli indici successivi partiranno da 0 (maggiori informazioni su questo punto nella\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\">documentazione di <code>array_fill<\/code><\/a>).\u00a0Si consideri il seguente esempio:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>In PHP 7.4 il risultato sarebbe il seguente:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Ora, <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">questa RFC<\/a> propone di cambiare le cose in modo che il secondo indice sia <code>start_index + 1<\/code>, qualunque sia il valore di <code>start_index<\/code>.<\/p>\n<p>In PHP 8, il codice di cui sopra risulterebbe nel seguente array:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Dunque, con PHP 8, gli array che iniziano con un indice negativo cambiano il loro comportamento. Per saperne di pi\u00f9 sulle retro-incompatibilit\u00e0 si legga\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">la RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\">Union Types 2.0<\/h3>\n<p>Gli <a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Union Types<\/a>\u00a0accettano valori che possono essere di diversi tipi. Attualmente, PHP non fornisce supporto per gli Union Types, con l&#8217;eccezione della sintassi del tipo <code>?Type<\/code> e del tipo speciale <code>iterabile<\/code>.<\/p>\n<p>Prima di PHP 8, gli Union Types potevano essere specificati solo nelle annotazioni phpdoc, come mostrato nell&#8217;esempio seguente tratto dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">La RFC Union Types 2.0<\/a> propone di aggiungere il supporto per gli Union Type nelle firme delle funzioni, in modo da non fare pi\u00f9 affidamento sulla\u00a0documentazione in linea, ma definisce invece gli Union Types con la sintassi <code>T1|T2|....<\/code>:<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Come spiegato da Nikita Popov nella RFC,<\/p>\n<blockquote><p>&#8220;Il supporto degli Union Types nel linguaggio ci permette di spostare pi\u00f9 informazioni sui tipi da phpdoc delle firme delle funzioni, con i soliti vantaggi che questo comporta:<\/p>\n<ul>\n<li>I tipi sono effettivamente applicati, quindi gli errori possono essere colti in anticipo.<\/li>\n<li>Dato che sono imposte, \u00e8 meno probabile che le informazioni sui tipi diventino obsolete o che non siano aggiornate.<\/li>\n<li>I tipi sono controllati durante l&#8217;ereditariet\u00e0, facendo rispettare il Principio di Sostituzione di Liskov.<\/li>\n<li>I tipi sono disponibili tramite Reflection.<\/li>\n<li>La sintassi \u00e8 molto meno da &#8220;boilerplate&#8221; rispetto a phpdoc&#8221;.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Gli Union Types supportano tutti i tipi disponibili, con alcune limitazioni:<\/p>\n<ul>\n<li>Il tipo <code>void<\/code> non pu\u00f2 essere parte di un&#8217;unione, in quanto <code>void<\/code> significa che una funzione <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">non restituisce alcun valore<\/a>.<\/li>\n<li>Il tipo <code>null<\/code> \u00e8 supportato solo negli Union Types, ma il suo utilizzo come tipo standalone non \u00e8 consentito.<\/li>\n<li>Anche la notazione di tipo nullable (<code>?T<\/code>) \u00e8 permessa, che significa <code>T|null<\/code>, ma non \u00e8 permesso includere la notazione <code>?T<\/code> negli Union Types (<code>?T1|T2<\/code> non \u00e8 permessa e dovremmo usare invece <code>T1|T2|null<\/code>).<\/li>\n<li>Dato che molte funzioni (cio\u00e8 <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, ecc.) includono <code>false<\/code> tra i possibili tipi di ritorno, \u00e8 supportato anche lo pseudotipo <code>false<\/code>.<\/li>\n<\/ul>\n<p>Potete leggere di pi\u00f9 sugli\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">Union Types V2<\/a> nell&#8217;RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Errori di Tipo Coerenti per le Funzioni Interne<\/h3>\n<p>Quando si passa un parametro di tipo illegale, le funzioni\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\">interne<\/a> e quelle <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">definite dall&#8217;utente<\/a> si comportano in modo diverso.<\/p>\n<p>Le funzioni definite dall&#8217;utente generano un <code>TypeError<\/code>, ma le funzioni interne si comportano in diversi modi, in base a diverse condizioni. In ogni caso, il comportamento tipico \u00e8 quello di emettere un avvertimento e restituire <code>null<\/code>. Si consideri il seguente esempio in PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Questo risulterebbe nel seguente avviso:<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Il comportamento sarebbe diverso se <code>strict_types<\/code> \u00e8 abilitato, o se le informazioni sugli argomenti specificano i tipi. In tali scenari, l&#8217;errore del tipo viene rilevato e risulta in un <code>TypeError<\/code>.<\/p>\n<p>Questa situazione comporterebbe ad una serie di problemi ben illustrati nella <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">sezione Issues<\/a> della\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">RFC<\/a>.<\/p>\n<p>Per rimuovere queste incongruenze, <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">questa RFC propone<\/a> far s\u00ec che le API interne di analisi dei parametri generino sempre un <code>ThrowError<\/code> in caso mancata corrispondenza dei tipi dei parametri.<\/p>\n<p>In PHP 8, il codice sopra riportato genera il seguente errore:<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">throw Come Espressione<\/h3>\n<p>In PHP, <code>throw<\/code> \u00e8 una <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">dichiarazione<\/a>, quindi non \u00e8 possibile utilizzarlo in situazioni in cui \u00e8 consentita solo un&#8217;<a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">espressione<\/a>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Questa RFC<\/a> propone di convertire l&#8217;<a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\">istruzione <code>throw<\/code><\/a> in un&#8217;espressione in modo che possa essere utilizzata in qualsiasi contesto in cui sono consentite le espressioni. Ad esempio, <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#arrow-functions\">arrow function<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">operatore null coalesce<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">operatori ternari ed elvis,<\/a> ecc.<\/p>\n<p>Si vedano i seguenti esempi tratti dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\">Weak Maps<\/h3>\n<p>Una weak map \u00e8 una collezione di dati (oggetti) in cui le chiavi sono referenziate debolmente, il che significa che non viene impedito loro di eliminate (garbage collected).<\/p>\n<p>PHP 7.4 ha aggiunto il supporto per le\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#weakreferences\">weak reference<\/a> come modo per mantenere un riferimento ad un oggetto che non impedisce all&#8217;oggetto stesso di essere distrutto. Come sottolineato da Nikita Popov,<\/p>\n<blockquote><p>&#8220;Le weak reference grezze da soli sono di limitata utilit\u00e0 e le weak map nella pratica sono utilizzate molto pi\u00f9 spesso. Non \u00e8 possibile implementare un&#8217;efficiente weak map al top delle weak reference di PHP perch\u00e9 non \u00e8 prevista la possibilit\u00e0 di registrare una callback di distruzione&#8221;.<\/p><\/blockquote>\n<p>Ecco perch\u00e9\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">questa RFC<\/a> introduce una classe <code>WeakMap<\/code> per creare oggetti da utilizzare come chiavi di weak map che possono essere distrutte e rimosse dalla weak map nel caso in cui non ci siano ulteriori riferimenti all&#8217;oggetto key.<\/p>\n<p>Nei processi di lunga durata, ci\u00f2 eviterebbe perdite di memoria e migliorerebbe le prestazioni. Si veda questo esempio tratto dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Con PHP 8, il codice di cui sopra produrrebbe il seguente risultato (vedere\u00a0<a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">il codice in azione qui<\/a>):<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Se si deregistra l&#8217;oggetto, la chiave viene automaticamente rimossa dalla weak map:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Adesso il risultato sarebbe il seguente:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Per una descrizione pi\u00f9 dettagliata delle Weak map, si legga\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">la RFC<\/a>. La proposta \u00e8 stata approvata all&#8217;unanimit\u00e0.<\/p>\n<h3 id=\"trailing-commas\">Virgola Finale negli Elenchi di Parametri<\/h3>\n<p>Le virgole finali sono virgole aggiunte ad elenchi di elementi in diversi contesti. PHP 7.2 ha introdotto le\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">virgole finali nella sintassi delle liste<\/a>, PHP 7.3 ha introdotto le\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-3\/#trailing-comma-in-function-calls\">virgole finali nelle chiamate di funzione<\/a>.<\/p>\n<p>PHP 8 introduce adesso le\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">virgole finali nelle liste di parametri<\/a> in funzioni, metodi e closure, come mostrato nell&#8217;esempio che segue:<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>La proposta \u00e8 passata con 58 voti favorevoli e 1 contrario.<\/p>\n<h3 id=\"class-syntax-on-objects\">Sintassi ::class Ammessa sugli Oggetti<\/h3>\n<p>Per ottenere il nome di una classe, possiamo utilizzare la sintassi <code>Foo\\Bar::class<\/code>. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Questa RFC<\/a> propone di estendere la stessa sintassi agli oggetti, in modo che sia ora possibile recuperare il nome della classe di un dato oggetto, come mostrato nel seguente esempio:<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>A partire da PHP 8, <code>$object::class<\/code> fornisce lo stesso risultato di <code>get_class($object)<\/code>. Se <code>$object<\/code> non \u00e8 un oggetto, allora viene generata un&#8217;eccezione <code>TypeError<\/code>.<\/p>\n<p>La proposta \u00e8 stata approvata all&#8217;unanimit\u00e0.<\/p>\n<h3 id=\"attributes\">Attributi v2<\/h3>\n<p>Gli attributi, noti anche come annotazioni, sono una forma di metadati strutturati che possono essere utilizzati per specificare le propriet\u00e0 di oggetti, elementi o file.<\/p>\n<p>Fino a PHP 7.4, i doc-comment erano l&#8217;unico modo per aggiungere metadati alle dichiarazioni di classi, funzioni, ecc. Ora, la <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">Attributes v2 RFC<\/a> introduce gli attributi in PHP, definendoli come una forma di metadati sintattici strutturati che possono essere aggiunti alle dichiarazioni di classi, propriet\u00e0, funzioni, metodi, parametri e costanti.<\/p>\n<p>Gli attributi vengono aggiunti prima delle dichiarazioni a cui si riferiscono. Si vedano i seguenti esempi tratti dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\nclass Foo\n{\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic $x;\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic function foo(&lt;&lt;ExampleAttribute&gt;&gt; $bar) { }\n}\n\n$object = new &lt;&lt;ExampleAttribute&gt;&gt; class () { };\n\n&lt;&lt;ExampleAttribute&gt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&lt;ExampleAttribute&gt;&gt; function () { };\n\n$f3 = &lt;&lt;ExampleAttribute&gt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Gli attributi possono essere aggiunti sia prima che dopo un commento del doc-block:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\n\/** docblock *\/\n&lt;&lt;AnotherExampleAttribute&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Ogni dichiarazione pu\u00f2 avere uno o pi\u00f9 attributi e ogni attributo pu\u00f2 avere uno o pi\u00f9 valori associati:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;WithoutArgument&gt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Si legga la\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC<\/a> per una descrizione pi\u00f9 approfondita degli attributi in PHP, dei casi d&#8217;uso e della sintassi alternativa.<\/p>\n<h3 id=\"named-arguments\">Argomenti Denominati<\/h3>\n<p>Gli <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">argomenti denominati<\/a> (&#8220;named arguments&#8221;) forniscono un nuovo modo di passare gli argomenti ad una funzione in PHP:<\/p>\n<blockquote><p>Gli argomenti denominati permettono di passare argomenti ad una funzione in base al nome del parametro, invece che che alla posizione del parametro.<\/p><\/blockquote>\n<p>Possiamo passare argomenti denominati ad una funzione semplicemente aggiungendo il nome del parametro prima del suo valore:<\/p>\n<pre><code class=\"language-php\">callFunction(name: $value);<\/code><\/pre>\n<p>Possiamo anche utilizzare parole chiave riservate, come mostrato nell&#8217;esempio qui sotto:<\/p>\n<pre><code class=\"language-php\">callFunction(array: $value);<\/code><\/pre>\n<p>Ma non \u00e8 possibile passare un nome di parametro in modo dinamico. Il parametro deve essere un identificatore e <strong> la seguente sintassi non \u00e8 ammessa<\/strong>:<\/p>\n<pre><code class=\"language-php\">callFunction($name: $value);<\/code><\/pre>\n<p>Secondo Nikita Popov, l&#8217;autore di questo RFC, i named arguments offrono diversi vantaggi.<\/p>\n<p>Prima di tutto, gli argomenti denominati ci aiuteranno a scrivere codice pi\u00f9 comprensibile perch\u00e9 il loro significato \u00e8 auto-documentato. L&#8217;esempio che segue dell&#8217;RFC si spiega da solo:<\/p>\n<pre><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/pre>\n<p>Gli argomenti denominati sono indipendenti dall&#8217;ordine. Ci\u00f2 significa che non siamo costretti a passare argomenti a una funzione nello stesso ordine della firma della funzione:<\/p>\n<pre><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/pre>\n<p>E&#8217; anche possibile combinare argomenti denominati con argomenti posizionali:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p>Un altro grande vantaggio degli argomenti denominati \u00e8 che permettono di specificare solo quegli argomenti che vogliamo effettivamente cambiare e non dobbiamo specificare gli argomenti predefiniti se non vogliamo sovrascriverne i valori. Si veda l&#8217;esempio seguente tratto dalla RFC:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Se sei uno <a href=\"https:\/\/kinsta.com\/it\/blog\/assumere-uno-sviluppatore-wordpress\/\">sviluppatore WordPress<\/a>, nota che, nel momento in cui scriviamo, gli argomenti denominati possono generare <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-5-6\/#named-parameters\">problemi di compatibilit\u00e0<\/a>. Non utilizzarli in produzione senza averli sottoposti a test accurati.<\/p>\n<\/aside>\n\n<p>Gli argomenti denominati possono essere utilizzati con <a href=\"#attributes\">gli attributi PHP<\/a>, come mostrato nell&#8217;esempio seguente tratto dall&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/pre>\n<p>Tuttavia, non \u00e8 consentito passare argomenti posizionali dopo gli argomenti denominati e comporta un errore di compilazione. Lo stesso accade quando si passa lo stesso nome di parametro due volte.<\/p>\n<p>Gli argomenti denominati sono particolarmente utili con le dichiarazioni di classe perch\u00e9 i costruttori di solito hanno un gran numero di parametri e gli argomenti denominati forniscono un modo pi\u00f9 &#8220;ergonomico&#8221; per dichiarare una classe.<\/p>\n<p>Per un&#8217;analisi pi\u00f9 approfondita dei Named Argument, con vincoli, incompatibilit\u00e0 e numerosi esempi, si veda la <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named Arguments RFC<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Operatore Nullsafe<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Questa RFC<\/a> introduce l&#8217;operatore nullsafe <code>$-&gt;<\/code> con <a href=\"https:\/\/it.wikipedia.org\/wiki\/Valutazione_a_corto_circuito\">valutazione a corto circuito<\/a> completa.<\/p>\n<p>Nella valutazione a corto circuito, il secondo operatore viene valutato solo se il primo operatore non viene valutato null. Se un operatore in una catena viene valutato <code>null<\/code>, l&#8217;esecuzione dell&#8217;intera catena si ferma e viene valutata <code>null<\/code>.<\/p>\n<p>Si consideri il seguente esempio tratto dalla RFC:<\/p>\n<pre><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/pre>\n<p>Se <code>$a<\/code> \u00e8 null, il metodo <code>b()<\/code> non viene invocato e <code>$foo<\/code> \u00e8 impostato a <code>null<\/code>.<\/p>\n<p>Si veda la <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Nullsafe Operator RFC<\/a> per altri esempi, eccezioni e futuro ambito di applicazione.<\/p>\n<h3 id=\"string-to-number-comparison\">Comparazioni pi\u00f9 Coerenti di Stringhe e Numeri<\/h3>\n<p>Nelle versioni precedenti di PHP, quando si effettuava un confronto non rigoroso tra stringhe e numeri, PHP prima converte la stringa a numero, poi esegue il confronto tra numeri interi o float. Anche se questo comportamento \u00e8 abbastanza utile in diverse situazioni, pu\u00f2 produrre risultati sbagliati che possono anche portare a bug e\/o problemi di sicurezza.<\/p>\n<p>Si consideri il seguente esempio dell&#8217;RFC:<\/p>\n<pre><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/pre>\n<p>PHP 8 introduce <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">Comparazioni pi\u00f9 coerenti di stringhe e numeri<\/a>, mirando a rendere pi\u00f9 ragionevoli i confronti tra stringhe e numeri. Nelle parole di Nikita Popov,<\/p>\n<blockquote><p>Questa RFC intende dare ai confronti tra stringhe di numeri un comportamento pi\u00f9 ragionevole: quando si confronta con una stringa numerica, effettua un confronto numerico (come adesso). Altrimenti, converte il numero in stringa ed effettua un confronto tra stringhe.<\/p><\/blockquote>\n<p>La seguente tabella mette a confronto il comportamento del confronto tra stringhe e numeri nelle versioni precedenti di PHP e in PHP 8:<\/p>\n<pre>Comparison    | Before | After\n------------------------------\n 0 == \"0\"     | true   | true\n 0 == \"0.0\"   | true   | true\n <strong>0 == \"foo\"   | true   | false<\/strong>\n <strong>0 == \"\"      | true   | false<\/strong>\n42 == \"   42\" | true   | true\n<strong>42 == \"42foo\" | true   | false<\/strong><\/pre>\n<p>Per un&#8217;analisi pi\u00f9 approfondita delle molte implicazioni di questa modifica e vedere come cambiano i confronti da stringa a numero in PHP 8, si legga la <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC di Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Stringhe Numeriche pi\u00f9 Coerenti<\/h3>\n<p>In PHP le stringhe contenenti numeri ricadono in <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">tre categorie<\/a>:<\/p>\n<ul>\n<li><strong>Stringhe numeriche<\/strong>: stringhe contenenti un numero eventualmente preceduto da spazi bianchi.<\/li>\n<li><strong>Stringhe che iniziano con un numero<\/strong>: stringhe i cui caratteri iniziali sono stringhe numeriche e i caratteri finali sono non numerici.<\/li>\n<li><strong>Stringhe non numeriche<\/strong>: le stringhe che non rientrano in nessuna delle precedenti categorie.<\/li>\n<\/ul>\n<p>Le stringhe numeriche e le stringhe che iniziano con un numero sono trattate in modo diverso a seconda dell&#8217;operazione eseguita. Ad esempio:<\/p>\n<ul>\n<li><strong>Le conversioni esplicite da stringa a numero<\/strong> (es. conversione di tipi tramite <code>(int)<\/code> e <code>(float)<\/code>) convertono in numeri le stringhe numeriche e che iniziano con numeri. Convertire esplicitamente una stringa non numerica in un numero produce 0.<\/li>\n<li><strong>Le conversioni implicite da stringa a numero<\/strong> (es. assenza di dichiarazione <code>strict_type<\/code>) portano a risultati diversi per le stringhe numeriche e non numeriche. Le conversioni da stringa non numerica a numero generano un <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> restituisce <strong>true<\/strong> solo per le stringhe numeriche.<\/li>\n<\/ul>\n<p>Anche gli offset delle stringhe, le operazioni aritmetiche, le operazioni di incremento e decremento, i confronti da stringa a stringa e le operazioni bitwise portano a risultati diversi.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Questa RFC<\/a> propone di:<\/p>\n<blockquote><p>Unificare le varie modalit\u00e0 di stringa numerica in un unico concetto: Caratteri numerici solo con spazi bianchi sia iniziali che finali consentiti. Qualsiasi altro tipo di stringa non \u00e8 numerico e genera TypeError se utilizzato in un contesto numerico.<\/p><\/blockquote>\n<blockquote><p>Ci\u00f2 significa che tutte le stringhe che attualmente emettono <strong>E_NOTICE<\/strong> &#8220;A non well formed numeric value encountered&#8221; saranno riclassificate in <strong>E_WARNING<\/strong> &#8220;A non-numeric value encountered&#8221;, a meno che la stringa che inizia con un numero non contenga solo spazi bianchi finali. E i vari casi che attualmente generano un <strong>E_WARNING<\/strong> saranno promossi a <code>TypeError<\/code>s.<\/p><\/blockquote>\n<p>Per un&#8217;analisi pi\u00f9 approfondita delle stringhe numeriche in PHP 8, con esempi di codice, eccezioni e problemi di retrocompatibilit\u00e0, si veda la <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a>.<\/p>\n<h3 id=\"match-expression\">Espressione Match v2<\/h3>\n<p>La nuova espressione <code>match<\/code> \u00e8 molto simile a <code>switch<\/code> ma con una semantica pi\u00f9 sicura e permettendo di restituire valori.<\/p>\n<p>Per capire meglio la differenza tra le due strutture di controllo, si consideri il seguente esempio di switch tratto dalla <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">switch (1) {\n case 0:\n $result = 'Foo';\n break;\n case 1:\n $result = 'Bar';\n break;\n case 2:\n $result = 'Baz';\n break;\n}\n \necho $result;\n\/\/&gt; Bar<\/code><\/pre>\n<p>Ora possiamo ottenere lo stesso risultato del codice di cui sopra con la seguente espressione <code>match<\/code>:<\/p>\n<pre><code class=\"language-php\">echo match (1) {\n 0 =&gt; 'Foo',\n 1 =&gt; 'Bar',\n 2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/pre>\n<p>Un grande vantaggio offerto dall&#8217;espressione <code>match<\/code> \u00e8 che, mentre <code>switch<\/code> effettua un confronto debole (<code>==<\/code>) che potrebbe portare a risultati inaspettati, con <code>match<\/code> il confronto \u00e8 un controllo di identit\u00e0 (<code>===<\/code>).<\/p>\n<p>L&#8217;espressione <code>match<\/code> pu\u00f2 anche contenere espressioni multiple separate da virgole, consentendo una sintassi pi\u00f9 concisa (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">fonte<\/a>):<\/p>\n<pre><code class=\"language-php\">$result = match ($x) {\n \/\/ This match arm:\n $a, $b, $c =&gt; 5,\n \/\/ Is equivalent to these three match arms:\n $a =&gt; 5,\n $b =&gt; 5,\n $c =&gt; 5,\n};<\/code><\/pre>\n<p>Per ulteriori esempi e casi d&#8217;uso, si veda la <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">Match expression v2 RFC<\/a> and the <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">documentazione PHP<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Controlli pi\u00f9 Stringenti per gli Operatori Aritmetici e Bitwise<\/h3>\n<p>Nelle versioni precedenti di PHP, applicare operatori <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">aritmetici<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitwise<\/a> ad un array, una risorsa o un oggetto non sovraccarico era consentito. Tuttavia, il comportamento era a volte incoerente.<\/p>\n<p>In <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">questa RFC<\/a>, Nikita Popov mostra quanto sia irragionevole questo comportamento con un semplice esempio:<\/p>\n<pre><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/pre>\n<p>Nikita spiega come l&#8217;applicazione di un operatore aritmetico o bitwise agli array, alle risorse o agli oggetti non sovraccarichi <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">portava a risultati diversi<\/a>:<\/p>\n<blockquote><p>Operatori +, -, *, \/, **:<\/p>\n<ul>\n<li>Lancia l&#8217;eccezione di errore sull&#8217;array operando. (Escluso + se entrambi gli operandi sono array).<\/li>\n<li>Converte silenziosamente un operando della risorsa nell&#8217;ID della risorsa come intero.<\/li>\n<li>Converte un operando oggetto in un operando intero, mentre genera un avviso.<\/li>\n<\/ul>\n<p>Operatori %, &lt;&lt;, &gt;&gt;, &#038;, |, ^:<\/p>\n<ul>\n<li>Converte silenziosamente un array operando in un numero intero zero se vuoto o in un numero intero uno se non vuoto.<\/li>\n<li>Converte silenziosamente una risorsa operando all&#8217;ID della risorsa come numero intero.<\/li>\n<li>Converte un oggetto operando in un intero, mentre genera un avviso.<\/li>\n<\/ul>\n<p>Operatore ~:<\/p>\n<ul>\n<li>Genera un&#8217;eccezione di errore per gli operandi array, risorse e oggetti.<\/li>\n<\/ul>\n<p>Operatori ++ and &#8211;:<\/p>\n<ul>\n<li>Non fa nulla se l&#8217;operando \u00e8 un array, una risorsa o un oggetto.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Con PHP 8 le cose cambiano e il comportamento \u00e8 lo stesso per tutti gli operatori aritmetici e bitwise:<\/p>\n<p><strong>Genera un&#8217;eccezione <code>TypeError<\/code> per operandi array, risorse e oggetti.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Nuove Funzioni di PHP<\/h2>\n<p>PHP 8 introduce nel linguaggio diverse nuove funzioni:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"-1\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\">str_contains<\/h3>\n<p>Prima di PHP 8, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> erano le opzioni tipiche che gli\u00a0<a href=\"https:\/\/kinsta.com\/it\/blog\/assumere-uno-sviluppatore-wordpress\/\">sviluppatori<\/a> potevano per cercare un needle all&#8217;interno di una data stringa. Il problema \u00e8 che entrambe le funzioni non sono molto intuitive e il loro utilizzo pu\u00f2 confondere gli sviluppatori PHP alle prime armi. Si consideri il seguente esempio:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>In questo esempio abbiamo utilizzato l&#8217;operatore di confronto <code>!==<\/code>, che controlla anche se due valori sono dello stesso tipo. Questo ci evita di ricevere un errore\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">se la posizione del needle \u00e8 0<\/a>:<\/p>\n<blockquote><p>&#8220;Questa funzione pu\u00f2 restituire il valore booleano <strong>FALSE<\/strong>, ma pu\u00f2 anche restituire un valore non booleano che corrisponde a <strong>FALSE<\/strong>. [&#8230;] Si utilizzi l&#8217;operatore ==== per testare il valore di ritorno di questa funzione&#8221;.<\/p><\/blockquote>\n<p>Inoltre, diversi framework forniscono funzioni helper per la ricerca di un valore all&#8217;interno di una determinata stringa (si veda come esempio la\u00a0<a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">documentazione degli Helper di Laravel<\/a>).<\/p>\n<p>Ora, <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">questa RFC<\/a> propone l&#8217;introduzione di una nuova funzione che permette di cercare all&#8217;interno di una stringa: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Il suo utilizzo \u00e8 piuttosto semplice. <code>str_contains<\/code> verifica se <code>$needle<\/code> si trova in <code>$haystack<\/code> e restituisce <code>true<\/code> o <code>false<\/code> di conseguenza.<\/p>\n<p>Quindi, grazie a <code>str_contains<\/code>, possiamo scrivere il seguente codice:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>Che \u00e8 pi\u00f9 leggibile e meno soggetto ad errori (si pu\u00f2 vedere questo codice in azione\u00a0<a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">qui<\/a>).<br \/>\nAl momento in cui scriviamo, <code>str_contains<\/code> \u00e8 case-sensitive, ma questa caratteristica potrebbe cambiare in futuro.<\/p>\n<p>La proposta di <code>str_contains<\/code> \u00e8 stata approvata con 43 voti favorevoli e 9 contrari.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() e str_ends_with()<\/h3>\n<p>Oltre alla funzione <code>str_contains<\/code>, due nuove funzioni permettono di cercare un needle (ago) all&#8217;interno di una determinata stringa: <code>str_starts_with<\/code> e <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Queste nuove funzioni<\/a> verificano se una data stringa inizia o finisce con un&#8217;altra stringa:<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Entrambe le funzioni restituiscono <code>false<\/code> se <code>$needle<\/code> \u00e8 pi\u00f9 lungo di <code>$haystack<\/code>.<\/p>\n<p>Secondo Will Hudgins, l&#8217;autore di questa RFC,<\/p>\n<blockquote><p>&#8220;La funzionalit\u00e0 di <code>str_starts_with<\/code> e <code>str_ends_with<\/code> \u00e8 cos\u00ec normalmente necessaria che \u00e8 supportata da molti dei principali framework PHP, tra cui\u00a0<a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony<\/a>, <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\">Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP<\/a> e <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a>&#8220;.<\/p><\/blockquote>\n<p>Grazie a queste funzioni, da ora in poi ora potremo evitare di utilizzare funzioni non ottimali e meno intuitive come <code>substr<\/code>, <code>strpos<\/code>. Entrambe le funzioni sono case sensitive:<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Potete vedere questo codice in azione\u00a0<a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">qui<\/a>.<\/p>\n<p>Questa RFC \u00e8 stata approvata con 51 voti favorevoli e 4 contrari.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> \u00e8 <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">una nuova funzione PHP<\/a> che restituisce il tipo di una variabile. La nuova funzione lavora in modo molto simile alla\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\">funzione <code>gettype<\/code><\/a>, ma <code>get_debug_type<\/code> restituisce i nomi nativi dei tipi e risolve i nomi delle classi.<\/p>\n<p>Si tratta di un buon miglioramento per il linguaggio, perch\u00e9 <code>gettype()<\/code> non \u00e8 utile per la verifica dei tipi.<\/p>\n<p>La RFC fornisce due utili esempi per comprendere meglio la differenza tra la nuova funzione <code>get_debug_type()<\/code> e <code>gettype()<\/code>. Il primo esempio mostra <code>gettype<\/code> al lavoro:<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Da PHP 8 in poi, potremo invece utilizzare <code>get_debug_type<\/code>:<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>La seguente tabella mostra i valori restituiti da <code>get_debug_type<\/code> e <code>gettype<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Valore<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>&#8220;WordPress&#8221;<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>Una classe con nome &#8220;Foo\\Bar&#8221;<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>Una classe anonima<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">Altre RFC<\/h2>\n<p>Ecco un breve elenco di altre novit\u00e0 approvate che fanno parte di PHP 8:<\/p>\n<ol>\n<li><strong>Interfaccia Stringable<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">questa RFC<\/a> introduce un&#8217;interfaccia stringable che viene aggiunta automaticamente alle classi che implementano il\u00a0<a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\">metodo <code>__to String()<\/code><\/a>. Lo scopo principale \u00e8 quello di utilizzare lo union type <code>string|Stringable<\/code>.<\/li>\n<li><strong>Nuove API DOM Living Standard in ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">questa RFC<\/a> si propone di implementare l&#8217;attuale <a href=\"https:\/\/dom.spec.whatwg.org\/\">DOM Living Standard<\/a> nell&#8217;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">estensione PHP DOM<\/a>, introducendo nuove interfacce e propriet\u00e0 pubbliche.<\/li>\n<li><strong>Tipo di ritorno static<\/strong>: PHP 8 introduce il tipo <code>static<\/code> come tipo di ritorno accanto ai tipi <code>self<\/code> e <code>parent<\/code>.<\/li>\n<li><strong>Variable Syntax Tweaks<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">questa RFC<\/a> risolve alcune incongruenze residue nella sintassi delle variabili di PHP.<\/li>\n<\/ol>\n\n<h2>Riepilogo<\/h2>\n<p>Che corsa! In questo post abbiamo trattato tutte le principali ottimizzazioni e le funzionalit\u00e0 portate da PHP 8. Il pi\u00f9 atteso \u00e8 sicuramente il compilatore Just in Time, ma c&#8217;\u00e8 molto di pi\u00f9 in PHP 8.<\/p>\n<p>Assicuratevi di aggiungere questo post tra i vostri bookmark, per futuro riferimento. \ud83e\udd13<\/p>\n<p>Ora tocca a voi: siete pronti a testare le nuove funzionalit\u00e0 di PHP? Qual \u00e8 la vostra novit\u00e0 preferita? Lasciateci una riga nella sezione dei commenti qui sotto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8 \u00e8 stato ufficialmente rilasciato alla General Availability lo scorso 26 novembre 2020. Questo nuovo importante aggiornamento porta tutta una serie di ottimizzazioni e potenti &#8230;<\/p>\n","protected":false},"author":36,"featured_media":36766,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[41,67],"topic":[26188],"class_list":["post-36752","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","topic-aggiornamenti-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cosa C&#039;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)<\/title>\n<meta name=\"description\" content=\"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cosa C&#039;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)\" \/>\n<meta property=\"og:description\" content=\"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/php-8\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-26T12:39:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-01T14:10:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Cosa C&#8217;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)\",\"datePublished\":\"2020-05-26T12:39:20+00:00\",\"dateModified\":\"2023-02-01T14:10:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/\"},\"wordCount\":5228,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"Sviluppo WordPress\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/\",\"name\":\"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\",\"datePublished\":\"2020-05-26T12:39:20+00:00\",\"dateModified\":\"2023-02-01T14:10:12+00:00\",\"description\":\"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg\",\"width\":1024,\"height\":512,\"caption\":\"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aggiornamenti PHP\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/aggiornamenti-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cosa C&#8217;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)","description":"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/php-8\/","og_locale":"it_IT","og_type":"article","og_title":"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)","og_description":"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!","og_url":"https:\/\/kinsta.com\/it\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2020-05-26T12:39:20+00:00","article_modified_time":"2023-02-01T14:10:12+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","twitter_creator":"@carlodaniele","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Carlo Daniele","Tempo di lettura stimato":"31 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Cosa C&#8217;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)","datePublished":"2020-05-26T12:39:20+00:00","dateModified":"2023-02-01T14:10:12+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/"},"wordCount":5228,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","keywords":["php","webdev"],"articleSection":["Sviluppo WordPress"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/","url":"https:\/\/kinsta.com\/it\/blog\/php-8\/","name":"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","datePublished":"2020-05-26T12:39:20+00:00","dateModified":"2023-02-01T14:10:12+00:00","description":"PHP 8 \u00e8 stato rilasciato il 26 novembre 2020. Porta nuove funzionalit\u00e0, miglioramenti e aumento delle prestazioni. Scopri le novit\u00e0 di PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2020\/05\/nuovo-php8-it.jpg","width":1024,"height":512,"caption":"Cosa C'\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/php-8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Aggiornamenti PHP","item":"https:\/\/kinsta.com\/it\/argomenti\/aggiornamenti-php\/"},{"@type":"ListItem","position":3,"name":"Cosa C&#8217;\u00c8 di Nuovo in PHP 8 (Funzionalit\u00e0, Miglioramenti e JIT Compiler)"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/36752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=36752"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/36752\/revisions"}],"predecessor-version":[{"id":44886,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/36752\/revisions\/44886"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/translations\/se"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/36752\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/36766"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=36752"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=36752"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=36752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}