{"id":47267,"date":"2021-09-01T15:26:39","date_gmt":"2021-09-01T13:26:39","guid":{"rendered":"https:\/\/kinsta.com\/?p=101567"},"modified":"2023-03-14T13:37:05","modified_gmt":"2023-03-14T12:37:05","slug":"php-8-1","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/","title":{"rendered":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro"},"content":{"rendered":"<p><a href=\"https:\/\/wiki.php.net\/todo\/php81\">PHP 8.1 \u00e8 finalmente arrivato<\/a>, e ci porter\u00e0 altre funzionalit\u00e0 interessanti. Il suo rilascio \u00e8 previsto per la fine di quest&#8217;anno, il 25 novembre 2021.<\/p>\n<p>In questo articolo, analizzeremo in dettaglio le novit\u00e0 di PHP 8.1. Dalle nuove funzionalit\u00e0 ai miglioramenti delle prestazioni, dalle modifiche pi\u00f9 significative, fino alle deprecazioni. Analizzeremo tutto in profondit\u00e0.<\/p>\n<p>Mettetevi comodi!<\/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>Nuove Funzionalit\u00e0 in PHP 8.1<\/h2>\n<p>Cominciamo ad analizzare tutte le nuove funzionalit\u00e0 di PHP 8.1. \u00c8 un bell&#8217;elenco.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"20\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>PHP 8.1 \u00e8 ora disponibile su Kinsta per tutti gli ambienti. Date un&#8217;occhiata al nostro <a href=\"https:\/\/kinsta.com\/it\/changelog\/php-8-1\/\">aggiornamento delle funzionalit\u00e0 di PHP 8.1<\/a> per maggiori informazioni.<\/p>\n<\/aside>\n\n\n<h3>Tipi Intersezione Pura<\/h3>\n<p>PHP 8.1 introduce il supporto per i tipi intersezione. \u00c8 simile ai <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#union-types-2-0\">tipi union<\/a> introdotti in PHP 8.0, ma il loro utilizzo previsto \u00e8 l&#8217;esatto opposto.<\/p>\n<p>Per capire meglio, rinfreschiamoci la memoria su come funzionano le dichiarazioni dei tipi in PHP.<\/p>\n<p>Essenzialmente, potete aggiungere dichiarazioni di tipo agli argomenti delle funzioni, ai valori di ritorno e alle propriet\u00e0 delle classi. Questa assegnazione \u00e8 chiamata type hinting e assicura che il valore sia del tipo corretto al momento della chiamata. In caso contrario, emette subito un <a href=\"https:\/\/www.php.net\/manual\/en\/class.typeerror.php\">TypeError<\/a>. Questo vi aiuta a fare meglio il debug del codice.<\/p>\n<p>Tuttavia, dichiarare un singolo tipo ha i suoi limiti. Gli Union Type vi aiutano a superare questo problema permettendovi di dichiarare un valore con pi\u00f9 tipi, e l&#8217;input deve soddisfare almeno uno dei tipi dichiarati.<\/p>\n<p>D&#8217;altra parte, <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types\">la RFC<\/a> descrive i tipi intersezione come:<\/p>\n<blockquote><p><em>Un &#8220;intersection type&#8221; richiede che un valore soddisfi pi\u00f9 vincoli di tipo invece di uno solo.<\/em><\/p>\n<p><em>&#8230;gli intersection type puri sono specificati utilizzando la sintassi T1&#038;T2&#038;&#8230; e possono essere utilizzati in tutte le posizioni dove i tipi sono accettati al momento&#8230;<\/em><\/p><\/blockquote>\n<p>Notate l&#8217;uso dell&#8217;operatore <code>&<\/code> (AND) per dichiarare i tipi intersezione. Al contrario, utilizziamo l&#8217;operatore <code>|<\/code> (OR) per dichiarare i tipi di unione.<\/p>\n<p>Usando la maggior parte dei tipi standard in un tipo di intersezione si otterr\u00e0 un tipo che non potr\u00e0 mai essere soddisfatto (ad es. intero e stringa). Quindi, i tipi intersezione possono includere solo tipi di classe (cio\u00e8 interfacce e nomi di classi).<\/p>\n<p>Ecco un esempio di codice in cui si utilizzano i tipi intersezione:<\/p>\n<pre><code class=\"language-php\">class A {\n    private Traversable&Countable $countableIterator;\n \n    public function setIterator(Traversable&Countable $countableIterator): void {\n        $this-&gt;countableIterator = $countableIterator;\n    }\n \n    public function getIterator(): Traversable&Countable {\n        return $this-&gt;countableIterator;\n    }\n}<\/code><\/pre>\n<p>Nel codice qui sopra, abbiamo definito una variabile <strong>countableIterator<\/strong> come intersezione di due tipi: <strong>Traversable<\/strong> e <strong>Countable<\/strong>. In questo caso, i due tipi dichiarati sono interfacce.<\/p>\n<p>I tipi intersezione sono anche conformi alle regole di varianza standard di PHP gi\u00e0 utilizzate per il controllo dei tipi e l&#8217;ereditariet\u00e0. Ma ci sono due regole aggiuntive che riguardano il modo in cui i tipi intersezione interagiscono con la sottotipizzazione. Potete approfondire le <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types#variance\">regole di varianza dei tipi intersezione<\/a> nella RFC.<\/p>\n<p>In alcuni linguaggi di programmazione, \u00e8 possibile combinare Tipi Unione e Tipi Intersezione nella stessa dichiarazione. Ma PHP 8.1 lo proibisce. Quindi, la sua implementazione \u00e8 chiamata tipi intersezione &#8220;pura&#8221;. Tuttavia, l&#8217;RFC afferma che questo \u00e8 &#8220;lasciato come scopo futuro&#8221;.<\/p>\n<h3>Enums<\/h3>\n<p>PHP 8.1 sta finalmente aggiungendo il supporto per gli enum (chiamati anche enumerazioni o tipi enumerati). Sono un tipo di dati definito dall&#8217;utente che consiste in un insieme di possibili valori.<\/p>\n<p>L&#8217;esempio pi\u00f9 comune di enum nei linguaggi di programmazione \u00e8 il tipo <strong>booleano<\/strong>, con <code>true<\/code> e <code>false<\/code> come possibili valori. \u00c8 cos\u00ec comune che \u00e8 supportato da molti <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">linguaggi di programmazione moderni<\/a>.<\/p>\n<p>Come da <a href=\"https:\/\/wiki.php.net\/rfc\/enumerations\">RFC<\/a>, all&#8217;inizio gli enum in PHP saranno limitati a &#8220;enumerazioni di unit\u00e0&#8221;:<\/p>\n<blockquote><p><em>Lo scopo di questa RFC \u00e8 limitato alle &#8220;enumerazioni di unit\u00e0&#8221;, cio\u00e8 le enumerazioni che sono esse stesse un valore, piuttosto che semplicemente una sintassi di fantasia per una costante primitiva, e non includono informazioni aggiuntive associate. Questa capacit\u00e0 offre un supporto molto esteso per la modellazione dei dati, definizioni di tipi personalizzati e comportamenti in stile monade. Gli enum permettono la tecnica di modellazione di &#8220;rendere irrappresentabili gli stati non validi&#8221;, che porta a un codice pi\u00f9 solido e minore bisogno di test esaustivi.<\/em><\/p><\/blockquote>\n<p>Per arrivare a questo stadio, il team PHP ha studiato molti linguaggi che gi\u00e0 supportano le enumerazioni. La <a href=\"https:\/\/github.com\/Crell\/enum-comparison\">loro indagine<\/a> ha rilevato che si possono categorizzare le enumerazioni in tre gruppi generali: Costanti fantasiose, oggetti fantasiosi e tipi di dati algebrici completi (ADT). \u00c8 una lettura interessante!<\/p>\n<p>PHP implementa gli enum &#8220;Fancy Objects&#8221;, con l&#8217;intenzione di estenderli agli ADT completi in futuro. \u00c8 concettualmente e semanticamente modellato dopo i tipi enumerati in Swift, Rust e Kotlin, anche se non \u00e8 direttamente modellato su nessuno di questi.<\/p>\n<p>La RFC usa la famosa analogia dei semi in un mazzo di carte per spiegare come funzioner\u00e0:<\/p>\n<pre><code class=\"language-php\">enum Suit {\n  case Hearts;\n  case Diamonds;\n  case Clubs;\n  case Spades;\n}<\/code><\/pre>\n<p>Qui, l&#8217;enum <strong>Suit<\/strong> definisce quattro possibili valori: <strong>Hearts<\/strong>, <strong>Diamonds<\/strong>, <strong>Clubs<\/strong> e <strong>Spades<\/strong>. Potete accedere a questi valori direttamente usando la sintassi: <code>Suit::Hearts<\/code>, <code>Suit::Diamonds<\/code>, <code>Suit::Clubs<\/code> e <code>Suit::Spades<\/code>.<\/p>\n<p>Questo tipo di utilizzo pu\u00f2 sembrare familiare, perch\u00e9 gli enum sono costruiti in cima a classi e oggetti. Si comportano in modo simile e hanno quasi gli stessi requisiti. Gli enum condividono gli stessi spazi dei nomi di classe, interfacce e tratti.<\/p>\n<p>Gli enum menzionati sopra sono chiamati <strong>Enum Puri<\/strong>.<\/p>\n<p>Potete anche definire <strong>Backed Enum<\/strong> se volete dare un valore scalare equivalente a qualsiasi caso. Tuttavia, i Backed Enum possono avere solo un tipo, o <code>int<\/code> o <code>string<\/code> (mai entrambi).<\/p>\n<pre><code class=\"language-php\">enum Suit: string {\n  case Hearts = 'H';\n  case Diamonds = 'D';\n  case Clubs = 'C';\n  case Spades = 'S';\n}<\/code><\/pre>\n<p>Inoltre, tutti i diversi casi di Backed Enum devono avere un valore univoco. E non si possono mai mischiare i due tipo di enum.<\/p>\n<p>L&#8217;RFC approfondisce ulteriormente i metodi enum, i metodi statici, le costanti, le espressioni costanti e molto altro. Analizzarli tutti va oltre lo scopo di questo articolo, ma potete fare riferimento alla documentazione.<\/p>\n<h3>Il Tipo di Ritorno <code>never<\/code><\/h3>\n<p>PHP 8.1 aggiunge un nuovo type hint di ritorno chiamato <code>never<\/code>. \u00c8 molto utile nelle funzioni si concludono sempre con <code>throw<\/code> o <code>exit<\/code>.<\/p>\n<p>Come da <a href=\"https:\/\/wiki.php.net\/rfc\/noreturn_type\">RFC<\/a>, le funzioni di redirect degli URL con <code>exit<\/code> (esplicitamente o implicitamente) sono un buon esempio del suo utilizzo:<\/p>\n<pre><code class=\"language-php\">function redirect(string $uri): never {\n    header('Location: ' . $uri);\n    exit();\n}\n \nfunction redirectToLoginPage(): never {\n    redirect('\/login');\n}<\/code><\/pre>\n<p>Una funzione dichiarata <code>never<\/code> dovrebbe soddisfare tre condizioni:<\/p>\n<ul>\n<li>Non dovrebbe avere la dichiarazione <code>return<\/code> definita esplicitamente.<\/li>\n<li>Non dovrebbe avere la dichiarazione <code>return<\/code> definita implicitamente (ad esempio, dichiarazioni <strong>if-else<\/strong>).<\/li>\n<li>Deve terminare la sua esecuzione con una dichiarazione <code>exit<\/code> (esplicitamente o implicitamente).<\/li>\n<\/ul>\n<p>L&#8217;esempio di <a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/regole-redirect\/\">redirect di URL<\/a> qui sopra mostra l&#8217;uso sia esplicito che implicito del tipo di ritorno <code>never<\/code>.<\/p>\n<p>Il tipo di ritorno <code>never<\/code> ha molte somiglianze con il tipo di ritorno <code>void<\/code>. Entrambi assicurano che la funzione o il metodo non restituisca un valore. Tuttavia, \u00e8 diverso perch\u00e9 applica regole pi\u00f9 rigide. Ad esempio, una funzione dichiarata <code>void<\/code> pu\u00f2 ancora concludersi con <code>return<\/code> senza un valore esplicito, ma non potete fare lo stesso con una funzione dichiarata <code>never<\/code>.<\/p>\n<p>Come regola generale, usate <code>void<\/code> quando vi aspettate che PHP continui l&#8217;esecuzione dopo la chiamata della funzione. Utilizzate <code>never<\/code> quando volete il contrario.<\/p>\n<p>Inoltre, <code>never<\/code> \u00e8 definito come un tipo &#8220;bottom&#8221;. Quindi, qualsiasi metodo di classe dichiarato <code>never<\/code> non pu\u00f2 &#8220;mai&#8221; cambiare il suo tipo di return in qualcos&#8217;altro. Tuttavia, \u00e8 possibile estendere un metodo dichiarato <code>void<\/code> con un metodo dichiarato <code>never<\/code>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La RFC originale elenca il tipo di ritorno <code>never<\/code> come <code>noreturn<\/code>, che era un tipo di ritorno gi\u00e0 supportato da due strumenti di analisi statica di PHP, cio\u00e8 Psalm e PHPStan. Dato che <code>never<\/code> \u00e8 stato proposto dagli stessi autori di Psalm e PHPStan, hanno mantenuto la stessa terminologia. Tuttavia, a causa delle convenzioni di denominazione, il team di PHP ha condotto un sondaggio per decidere tra <code>noreturn<\/code> e <code>never<\/code>, e alla fine si \u00e8 deciso per <code>never<\/code>. Quindi, per le versioni di PHP 8.1+, sostituite sempre <code>noreturn<\/code> con <code>never<\/code>.<\/p>\n<\/aside>\n\n<h3>Fiber<\/h3>\n<p>Storicamente, il codice PHP \u00e8 quasi sempre stato un codice sincrono. L&#8217;esecuzione del codice si ferma finch\u00e9 non viene restituito il risultato, anche per le operazioni di I\/O. Potete immaginare perch\u00e9 questo processo pu\u00f2 rallentare l&#8217;esecuzione del codice.<\/p>\n<p>Ci sono molteplici soluzioni di terze parti per superare questo ostacolo e permettere agli sviluppatori di scrivere codice PHP in modo asincrono, specialmente per operazioni di I\/O concorrenti. Alcuni esempi sono <a href=\"https:\/\/amphp.org\/\">amphp<\/a>, <a href=\"https:\/\/reactphp.org\/\">ReactPHP<\/a> e <a href=\"https:\/\/guzzlephp.org\/\">Guzzle<\/a>.<\/p>\n<p>Tuttavia, non c&#8217;\u00e8 un modo standard per gestire queste istanze in PHP. Inoltre, trattare il codice sincrono e asincrono nello stesso stack di chiamate <a href=\"https:\/\/journal.stuffwithstuff.com\/2015\/02\/01\/what-color-is-your-function\/\">porta ad altri problemi<\/a>.<\/p>\n<p>Le Fiber sono il modo di PHP di gestire il parallelismo tramite thread virtuali (o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_threads\">thread verdi<\/a>). In questo modo si cerca di eliminare la differenza tra codice sincrono e asincrono permettendo alle funzioni PHP di interrompersi senza influenzare l&#8217;intero stack delle chiamate.<\/p>\n<p>Ecco cosa <em>promette<\/em> <a href=\"https:\/\/wiki.php.net\/rfc\/fibers\">l&#8217;RFC<\/a>:<\/p>\n<ul>\n<li>Aggiunge il supporto delle Fiber in PHP.<\/li>\n<li>Introduce una nuova classe Fiber e la corrispondente classe di riflessione ReflectionFiber.<\/li>\n<li>Aggiunge classi di eccezione FiberError e FiberExit per rappresentare gli errori.<\/li>\n<li>Le Fiber permettono implementazioni trasparenti di I\/O delle interfacce esistenti non bloccanti (PSR-7, Doctrine ORM, ecc.). Questo perch\u00e9 l&#8217;oggetto segnaposto (promessa) viene eliminato. Le funzioni possono dichiarare il tipo di risultato I\/O invece di un oggetto segnaposto che non pu\u00f2 specificare un tipo di risoluzione perch\u00e9 PHP non supporta i generici.<\/li>\n<\/ul>\n<p>Potete utilizzare le Fiber per sviluppare funzioni PHP full-stack, interrompibili, che potete poi utilizzare per implementare il multitasking cooperativo in PHP. Dato che Fibers mette in pausa l&#8217;intero <a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/wordpress-monitoraggio\/strumento-apm\/#stack-trace\">stack di esecuzione<\/a>, potete stare tranquilli sapendo che questo non dannegger\u00e0 il resto del codice.<\/p>\n<figure id=\"attachment_110018\" aria-describedby=\"caption-attachment-110018\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110018 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow-e1637845079600.png\" alt=\"Grafico che illustra il flusso di esecuzione del codice PHP con Fiber. (PHP.net)\" width=\"1100\" height=\"894\"><\/a><figcaption id=\"caption-attachment-110018\" class=\"wp-caption-text\">Grafico che illustra il flusso di esecuzione del codice PHP con Fiber. (PHP.net)<\/figcaption><\/figure>\n<p>Per illustrare il modo in cui utilizzare le Fiber, l&#8217;RFC riporta questo semplice esempio:<\/p>\n<pre><code class=\"language-php\">$fiber = new Fiber(function (): void {\n    $value = Fiber::suspend('fiber');\n    echo \"Value used to resume fiber: \", $value, \"\\n\";\n});\n \n$value = $fiber-&gt;start();\n \necho \"Value from fiber suspending: \", $value, \"\\n\";\n \n$fiber-&gt;resume('test');<\/code><\/pre>\n<p>Nel codice di cui sopra create una &#8220;fibra&#8221; e la sospendete immediatamente con la stringa <code>fiber<\/code>. La dichiarazione <code>echo<\/code> serve come spunto visivo per la ripresa della fibra.<\/p>\n<p>Si pu\u00f2 recuperare questo valore di stringa dalla chiamata a <code>$fiber-&gt; start()<\/code>.<\/p>\n<p>Poi, si riprende la fibra con la stringa &#8220;test&#8221;, che viene restituita dalla chiamata a <code>Fiber::suspend()<\/code>. L&#8217;esecuzione completa del codice risulta in questo output:<\/p>\n<pre><code class=\"language-php\">Value from fiber suspending: fiber\nValue used to resume fiber: test<\/code><\/pre>\n<p>Questo \u00e8 l&#8217;esempio da manuale delle &#8220;PHP Fibers&#8221; al lavoro. <a href=\"https:\/\/github.com\/nox7\/async-php-8-io-http\">Ecco un altro esempio di Fiber<\/a> che esegue sette richieste GET asincrone.<\/p>\n<p>Con tutto ci\u00f2 che \u00e8 stato detto e fatto, la maggior parte degli sviluppatori PHP non avr\u00e0 mai a che fare direttamente con le Fiber. E l&#8217;RFC suggerisce addirittura la stessa cosa:<\/p>\n<blockquote><p><em>Le Fiber sono una funzionalit\u00e0 avanzata che la maggior parte degli utenti non utilizzer\u00e0 direttamente. Questa funzionalit\u00e0 \u00e8 rivolta principalmente agli autori di librerie e framework per fornire un ciclo di eventi e un&#8217;API di programmazione asincrona. Le Fiber permettono di integrare l&#8217;esecuzione di codice asincrono senza interruzioni nel codice sincrono in qualsiasi punto senza la necessit\u00e0 di modificare lo stack delle chiamate dell&#8217;applicazione o aggiungere codice boilerplate.<\/em><\/p>\n<p><em>Non ci si aspetta che l&#8217;API Fiber sia utilizzata direttamente nel codice a livello di applicazione. Le Fiber forniscono un&#8217;API di base e di basso livello per il controllo del flusso per creare astrazioni di livello superiore che sono poi utilizzate nel codice dell&#8217;applicazione.<\/em><\/p><\/blockquote>\n<p>Considerando i vantaggi in termini di prestazioni, ci si pu\u00f2 aspettare che le librerie e i framework PHP approfittino di questa nuova funzionalit\u00e0. Sar\u00e0 interessante vedere come implementeranno le Fiber nel loro ecosistema.<\/p>\n<h3>Nuove Propriet\u00e0 <code>readonly<\/code><\/h3>\n<p>PHP 8.1 aggiunge il supporto per le propriet\u00e0 <code>readonly<\/code>. Possono essere inizializzate solo una volta dallo scopo in cui sono dichiarate. Una volta inizializzate, non sar\u00e0 possibile modificare il loro valore. Farlo significherebbe lanciare un&#8217;eccezione di <strong>Error<\/strong>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/readonly_properties_v2\">La RFC<\/a> recita:<\/p>\n<blockquote><p><em>Una propriet\u00e0 <strong>readonly <\/strong>pu\u00f2 essere inizializzata solo una volta, e solo dallo scopo in cui \u00e8 stata dichiarata. Qualsiasi altra assegnazione o modifica della propriet\u00e0 risulter\u00e0 in un&#8217;eccezione Error.<\/em><\/p><\/blockquote>\n<p>Ecco un esempio d&#8217;uso:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public readonly string $kinsta;\n \n    public function __construct(string $kinsta) {\n        \/\/ Legal initialization.\n        $this-&gt;kinsta = $kinsta;\n    }\n}<\/code><\/pre>\n<p>Una volta inizializzato, non si pu\u00f2 tornare indietro. Avere questa funzionalit\u00e0 nativamente in PHP riduce notevolmente il codice boilerplate che spesso utilizzato per abilitarla.<\/p>\n<p>La propriet\u00e0 <code>readonly<\/code> offre una forte garanzia di immutabilit\u00e0, sia dentro che fuori la classe. Non importa quale codice venga eseguito nel mezzo. Invocare una propriet\u00e0 <code>readonly<\/code> restituir\u00e0 sempre lo stesso valore.<\/p>\n<p>Tuttavia, utilizzare le propriet\u00e0 <code>readonly<\/code> pu\u00f2 non essere ideale in casi d&#8217;uso specifici. Ad esempio, potete utilizzarle solo insieme a una <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#typed-properties\">propriet\u00e0 tipizzata<\/a>, perch\u00e9 le dichiarazioni senza un tipo sono implicitamente <code>null<\/code> e non possono essere <code>readonly<\/code>.<\/p>\n<p>Inoltre, impostare una propriet\u00e0 <code>readonly<\/code> non rende gli oggetti immutabili. La propriet\u00e0 <code>readonly<\/code> manterr\u00e0 lo stesso oggetto, ma l&#8217;oggetto stesso pu\u00f2 cambiare.<\/p>\n<p>Un altro problema minore con questa propriet\u00e0 \u00e8 che non \u00e8 possibile clonarla. C&#8217;\u00e8 gi\u00e0 un <a href=\"https:\/\/stitcher.io\/blog\/cloning-readonly-properties-in-php-81\">workaround per questa particolare situazione<\/a>. Cercatelo, se necessario.<\/p>\n<h3>Definire Costanti di Classe <code>final<\/code><\/h3>\n<p>A partire da PHP 8.0, \u00e8 possibile sovrascrivere le costanti di classe con le classi child. Ci\u00f2 \u00e8 dovuto al modo in cui l&#8217;ereditariet\u00e0 \u00e8 implementata in PHP.<\/p>\n<p>Ecco un esempio che illustra come sovrascrivere il valore di una costante dichiarata in precedenza:<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n    public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n    public const M = \"meow\";\n}  <\/code><\/pre>\n<p>Ora, se le mucche vogliono diventare pi\u00f9 severe sul comportamento dei gatti (almeno con le costanti), possono farlo con il nuovo modificatore <code>final<\/code> di PHP 8.1.<\/p>\n<p>Una volta che avete dichiarato una costante come <code>final<\/code>, significa proprio questo.<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n    final public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n    public const M = \"meow\";\n}\n \n\/\/ Fatal error: Meow::M cannot override final constant Moo::M<\/code><\/pre>\n<p>Potete approfondire l&#8217;argomento nella RFC sulle <a href=\"https:\/\/wiki.php.net\/rfc\/final_class_const\">costanti finali di classe<\/a> in PHP.<\/p>\n<h3>Funzioni <code>fsync()<\/code> e <code>fdatasync()<\/code><\/h3>\n<p>PHP 8.1 aggiunge due nuove funzioni di file system chiamate <code>fsync()<\/code> e <code>fdatasync()<\/code>. Sembreranno familiari a chi conosce le <a href=\"https:\/\/linux.die.net\/man\/2\/fsync\">funzioni Linux con lo stesso nome<\/a>. Questo perch\u00e9 sono correlate, solo implementate per PHP.<\/p>\n<p>In effetti, questa novit\u00e0 era attesa da tempo. PHP \u00e8 uno dei pochi grandi linguaggi di programmazione che ancora non implementava <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\">fsync() e fdatasync()<\/a> &#8211; almeno <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\">fino a PHP 8.1<\/a>.<\/p>\n<p>La funzione <code>fsync()<\/code> \u00e8 simile alla funzione esistente <code>fflush()<\/code> di PHP, ma differisce in un modo significativo per un motivo. Mentre <code>fflush()<\/code> esegue il flush dei buffer interni dell&#8217;applicazione verso il sistema operativo, <code>fsync()<\/code> fa un passo avanti e fa s\u00ec che i buffer interni vengano esguiti sulla <a href=\"https:\/\/kinsta.com\/it\/blog\/ssd\/\">memoria<\/a> fisica. Questo assicura una scrittura completa e persistente che permette di recuperare i dati anche dopo un crash dell&#8217;applicazione o del sistema.<\/p>\n<p>Ecco un esempio.<\/p>\n<pre><code class=\"language-php\">$doc = 'kinsta.txt';\n\n$kin = fopen($doc, 'ki');\nfwrite($kin, 'doc info');\nfwrite($kin, \"\\r\\n\");\nfwrite($kin, 'more info');\n\nfsync($kin);\nfclose($kin);<\/code><\/pre>\n<p>Aggiungere la chiamata <code>fsync()<\/code> alla fine assicura che tutti i dati contenuti nel buffer interno di PHP o del sistema operativo vengano scritti nella memoria. Tutte le altre esecuzioni di codice sono bloccate fino ad allora.<\/p>\n<p>La sua funzione correlata \u00e8 <code>fdatasync()<\/code>. Questa va utilizzata per sincronizzare i dati ma non necessariamente i metadati. Per i dati i cui metadati non sono essenziali, questa chiamata di funzione rende la scrittura un po&#8217; pi\u00f9 veloce.<\/p>\n<p>Tuttavia, si noti che PHP 8.1 non supporta ancora completamente <code>fdatasync()<\/code> su Windows. Funge semplicemente da alias di <code>fsync()<\/code>. Su POSIX, <code>fdatasync()<\/code> \u00e8 implementato correttamente.<\/p>\n<h3>Nuova Funzione <code>array_is_list()<\/code><\/h3>\n<p>Gli array PHP possono contenere sia chiavi intere che stringhe. Questo significa che potete utilizzarli per diverse cose, come liste, tabelle hash, dizionari, collezioni, pile, code e molto altro. Potete anche avere array dentro array, creando array multidimensionali.<\/p>\n<p>Si pu\u00f2 verificare se una particolare voce \u00e8 un array, ma non \u00e8 cos\u00ec facile controllare se questo ha qualche offset di array mancante, chiavi fuori ordine, ecc. In breve, non \u00e8 possibile verificare rapidamente se un array \u00e8 una lista.<\/p>\n<p>La <a href=\"https:\/\/wiki.php.net\/rfc\/is_list\">funzione array_is_list()<\/a> controlla se le chiavi di un array sono in ordine sequenziale a partire da <code>0<\/code> e senza spazi vuoti. Se tutte le condizioni sono soddisfatte, restituisce <code>true<\/code>. Di default, restituisce <code>true<\/code> anche per gli array vuoti.<\/p>\n<p>Ecco alcuni esempi con condizioni sia <code>true<\/code> che <code>false<\/code>:<\/p>\n<pre><code class=\"language-php\">\/\/ true array_is_list() examples\narray_is_list([]); \/\/ true\narray_is_list([1, 2, 3]); \/\/ true\narray_is_list(['cats', 2, 3]); \/\/ true\narray_is_list(['cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 1 =&gt; 'dogs']); \/\/ true \n\n\/\/ false array_is_list() examples \narray_is_list([1 =&gt; 'cats', 'dogs']); \/\/ as first key isn't 0\narray_is_list([1 =&gt; 'cats', 0 =&gt; 'dogs']); \/\/ keys are out of order\narray_is_list([0 =&gt; 'cats', 'bark' =&gt; 'dogs']); \/\/ non-integer keys\narray_is_list([0 =&gt; 'cats', 2 =&gt; 'dogs']); \/\/ gap in between keys <\/code><\/pre>\n<p>Una lista di array PHP con chiavi fuori ordine \u00e8 <a href=\"https:\/\/kinsta.com\/it\/blog\/wordpress-e-sicurezza\/#2-use-latest-php-version\">una potenziale fonte di bug<\/a>. Questa funzione pu\u00f2 essere utilizzata per imporre una stretta aderenza ai requisiti della <strong>lista<\/strong> prima di andare avanti con l&#8217;esecuzione del codice.<\/p>\n<h3>Nuove Funzioni Sodium XChaCha20<\/h3>\n<p>Sodium \u00e8 una libreria semplice e moderna per la crittografia, la decrittografia, l&#8217;hashing delle <a href=\"https:\/\/kinsta.com\/it\/blog\/password-manager\/\">password<\/a>, le firme e altro. Il <a href=\"https:\/\/pecl.php.net\/package\/libsodium\">pacchetto PECL libsodium<\/a> aggiunge un wrapper per Sodium a beneficio degli sviluppatori PHP.<\/p>\n<p>Anche <a href=\"https:\/\/doc.libsodium.org\/libsodium_users\">aziende tecnologiche leader<\/a> come Facebook, Discord, Malwarebytes e Valve usano libsodium per proteggere i propri utenti con connessioni veloci e sicure.<\/p>\n<p>libsodium supporta l&#8217;<a href=\"https:\/\/www.cryptopp.com\/wiki\/XChaCha20\">algoritmo di crittografia XChaCha20<\/a> per cifrare e decifrare i dati, specialmente per la crittografia dei flussi. Allo stesso modo, l&#8217;estensione PECL libsodium supporta gi\u00e0 XChaCha20, ma solo con il codice di autenticazione dei messaggi Poly1305.<\/p>\n<p>Molte applicazioni PHP usano XChaCha20 direttamente per la crittografia dei flussi. Per semplificare le cose, a partire da PHP 8.1, avremo tre nuove funzioni per criptare o decriptare i dati con XChaCha20 senza autenticazione. Questa modalit\u00e0 \u00e8 chiamata &#8220;modalit\u00e0 distaccata&#8221;.<\/p>\n<p>Le nuove funzioni di XChaCha20 sono:<\/p>\n<ul>\n<li><code>sodium_crypto_stream_xchacha20_keygen<\/code>: Restituisce una chiave casuale sicura da usare con sodium_crypto_stream_xchacha20.<\/li>\n<li><code>sodium_crypto_stream_xchacha20<\/code>: Espande la chiave e il nonce in un keystream di byte pseudorandom.<\/li>\n<li><code>sodium_crypto_stream_xchacha20_xor<\/code>: Cripta un messaggio utilizzando un nonce e una chiave segreta (nessuna autenticazione).<\/li>\n<\/ul>\n<p>Inoltre, ci sono due nuove costanti PHP definite nello spazio dei nomi globali:<\/p>\n<ul>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES<\/code> (assigned <strong>32<\/strong>)<\/li>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES<\/code> (assigned <strong>24<\/strong>)<\/li>\n<\/ul>\n<p>Usatelo con cautela, per\u00f2. Dato che \u00e8 senza autenticazione, l&#8217;operazione di decrittazione \u00e8 vulnerabile ai comuni attacchi ciphertext.<\/p>\n<p>Potete leggere altro sull&#8217;utilizzo e sui requisiti sulla <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6868\">pagina GitHub<\/a>.<\/p>\n<h3>Nuova Classe IntlDatePatternGenerator<\/h3>\n<p>La libreria ICU sottostante di PHP permette di creare <a href=\"https:\/\/kinsta.com\/it\/blog\/plugin-calendario-wordpress\/\">formati di data e ora<\/a> localizzati, ma non \u00e8 completamente personalizzabile.<\/p>\n<p>Ad esempio, fino a PHP 8.0, potete creare formati di data e ora specifici per il locale utilizzando la <a href=\"https:\/\/www.php.net\/manual\/en\/class.intldateformatter.php\">costante predefinita IntlDateFormatter<\/a>. Avete 6 modi per farlo:<\/p>\n<ul>\n<li><strong><code>IntlDateFormatter::LONG<\/code>:<\/strong> Pi\u00f9 lungo, come <strong>November 10, 2017<\/strong> o <strong>11:22:33pm<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::MEDIUM<\/code>:<\/strong> Un po&#8217; pi\u00f9 corto, come <strong>Nov 10, 2017<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::SHORT<\/code>:<\/strong> Solo numerico, come <strong>10\/11\/17<\/strong> o <strong>11:22pm<\/strong><\/li>\n<\/ul>\n<p>Ognuno di questi ha anche la sua variante <code>RELATIVE_<\/code>, che imposta la formattazione della data in un intervallo limitato prima o dopo la data corrente. In PHP, i valori sono <strong>yesterday<\/strong>, <strong>today<\/strong> e <strong>tomorrow<\/strong>.<\/p>\n<p>Supponiamo di voler utilizzare la versione lunga per l&#8217;anno e la versione breve per il mese, come <strong>10\/11\/2017<\/strong>. Con PHP 8.0 non \u00e8 possibile.<\/p>\n<p>A partire da PHP 8.1, potete specificare i formati da usare per la data, il mese e l&#8217;ora grazie alla nuova classe <strong>IntlDatePatternGenerator.<\/strong> Potete lasciare l&#8217;ordine esatto di questi componenti al formatter.<\/p>\n<p>Si noti che, anche se la classe ha solo la parola <strong>Date<\/strong>, \u00e8 coerente con <strong>DateTimePatternGenerator<\/strong> di ICU. Ci\u00f2 significa che potete utilizzarla anche per creare formati temporali flessibili. Per semplificare la denominazione, il team di PHP ha scelto di utilizzare il termine pi\u00f9 breve <strong>IntlDatePatternGenerator<\/strong>.<\/p>\n<p>Ecco un esempio offerto dalla <a href=\"https:\/\/wiki.php.net\/rfc\/intldatetimepatterngenerator\">RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$skeleton = \"YYYYMMdd\";\n \n$today = \\DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');\n \n$dtpg = new \\IntlDatePatternGenerator(\"de_DE\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton);\necho \"de: \", \\IntlDateFormatter::formatObject($today, $pattern, \"de_DE\"), \"\\n\";\n \n$dtpg = new \\IntlDatePatternGenerator(\"en_US\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton), \"\\n\";\necho \"en: \", \\IntlDateFormatter::formatObject($today, $pattern, \"en_US\"), \"\\n\";\n \n\/*\nde: 24.04.2021\nen: 04\/24\/2021\n*\/<\/code><\/pre>\n<p>Nel codice precedente, la variabile <strong>skeleton<\/strong> definisce i particolari formati di data o ora. Tuttavia, il formattatore gestisce l&#8217;ordine del risultato finale.<\/p>\n<h3>Supporto del Formato Immagine AVIF<\/h3>\n<p>AVIF, o AV1 Image File Format, \u00e8 un <a href=\"https:\/\/kinsta.com\/it\/blog\/formati-file-immagine\/\">formato immagine<\/a> relativamente nuovo senza diritti d&#8217;autore basato sul formato di codifica video AV1. Oltre ad offrire una maggiore compressione (e quindi dimensioni di file minori), supporta anche diverse caratteristiche come la trasparenza, HDR e altro.<\/p>\n<p>Il formato AVIF \u00e8 stato <a href=\"https:\/\/aomediacodec.github.io\/av1-avif\/\">standardizzato solo di recente<\/a> (8 giugno 2021). Questo ha aperto la strada ai browser, come Chrome 85+ e Firefox 86+, che hanno aggiunto il supporto per le immagini AVIF.<\/p>\n<p>L&#8217;elaborazione delle immagini di PHP 8.1 e l&#8217;estensione GD aggiungono il supporto delle immagini AVIF.<\/p>\n<p>Tuttavia, per includere questa funzionalit\u00e0, \u00e8 necessario compilare l&#8217;estensione GD con supporto AVIF. Potete farlo eseguendo i comandi qui sotto.<\/p>\n<p>Per Debian\/Ubuntu:<\/p>\n<pre><code class=\"language-bash\">apt install libavif-dev<\/code><\/pre>\n<p>Per Fedora\/RHEL:<\/p>\n<pre><code class=\"language-bash\">dnf install libavif-devel<\/code><\/pre>\n<p>Questo installer\u00e0 tutte le ultime dipendenze. Di seguito, potete compilare il supporto AVIF eseguendo il flag <code>--with-avif<\/code> con lo script <code>.\/configure<\/code>.<\/p>\n<pre><code class=\"language-bash\">.\/buildconf --force\n.\/configure --enable-gd --with-avif<\/code><\/pre>\n<p>Se state avviando un nuovo ambiente da zero, puoi anche abilitare altre estensioni PHP qui.<\/p>\n<p>Una volta installato, potete testare se il supporto AVIF \u00e8 abilitato eseguendo il seguente comando nel terminale PHP:<\/p>\n<pre><code class=\"language-bash\">php -i | grep AVIF<\/code><\/pre>\n<p>Se avete installato correttamente AVIF, vedrete questo risultato:<\/p>\n<pre><code class=\"language-bash\">AVIF Support =&gt; enabled<\/code><\/pre>\n<p>Potete anche eseguire una chiamata <code>gd_info()<\/code> per recuperare un elenco di caratteristiche di GD, incluso il supporto della funzionalit\u00e0 <strong>AVIF Support<\/strong>.<\/p>\n<p>L&#8217;aggiornamento di questa estensione GD di PHP 8.1 aggiunge anche due nuove funzioni che consentono di lavorare con le immagini AVIF: <code>imagecreatefromavif<\/code> e <code>imageavif<\/code>. Funzionano in modo simile alle rispettive controparti JPEG e PNG.<\/p>\n<p>La funzione <code>imagecreatefromavif<\/code> restituisce un&#8217;istanza GdImage da una data immagine AVIF. Potete quindi utilizzare questa istanza per modificare o convertire l&#8217;immagine.<\/p>\n<p>La funzione <code>imageavif<\/code> produce il file immagine AVIF. Ad esempio, potete utilizzarla per convertire un JPEG in AVIF:<\/p>\n<pre><code class=\"language-php\">$image = imagecreatefromjpeg('image.jpeg');\nimageavif($image, 'image.avif');<\/code><\/pre>\n<p>Potete leggere di pi\u00f9 su questa nuova funzione nella <a href=\"https:\/\/github.com\/php\/php-src\/pull\/7026\">pagina GitHub<\/a>.<\/p>\n<h3>Nuova Chiave <code>$_FILES: full_path<\/code> per il Caricamento delle Directory<\/h3>\n<p>PHP mantiene un gran numero di variabili predefinite per tenere traccia di varie cose. Una di queste \u00e8 la <a href=\"https:\/\/www.php.net\/manual\/en\/reserved.variables.files.php\">variabile $_FILES<\/a> che contiene un array associativo di elementi caricati tramite il metodo HTTP POST.<\/p>\n<p>La maggior parte dei browser moderni supporta il <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/input\/file#htmlattrdefwebkitdirectory_non-standard_inline\">caricamento di un&#8217;intera directory<\/a> con i campi <a href=\"https:\/\/kinsta.com\/it\/blog\/come-caricare-un-file-html-in-wordpress\/\">HTML per il caricamento dei file.<\/a> Anche PHP &lt;8.1 supportava questa funzionalit\u00e0, ma con un importante avvertimento. Non si poteva caricare una cartella con la sua esatta struttura di directory o percorsi relativi perch\u00e9 PHP non passava queste informazioni all&#8217;array <code>$_FILES<\/code>.<\/p>\n<p>In PHP 8.1 le cose cambiano, grazie all&#8217;aggiunta di una nuova chiave <code>full_path<\/code> all&#8217;array <code>$_FILES<\/code>. Con questi nuovi dati, \u00e8 possibile memorizzare percorsi relativi o duplicare l&#8217;esatta struttura della directory sul server.<\/p>\n<p>Potete testare queste informazioni emettendo l&#8217;array <code>$FILES<\/code> utilizzando il comando <code>var_dump($_FILES);<\/code>.<\/p>\n<p>Ma procedete con cautela. Assicuratevi di proteggervi dagli <a href=\"https:\/\/php.watch\/versions\/8.1\/$_FILES-full-path#security-hardening\">attacchi standard di caricamento dei file<\/a>.<\/p>\n<h3>Spacchettamento degli Array per gli Array con Chiavi a Stringa<\/h3>\n<p>PHP 7.4 ha aggiunto il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#array-spread-operator\">supporto dello spacchettamento degli array<\/a> con lo spread operatore di diffusione degli array (<strong>&#8230;<\/strong>). \u00c8 un&#8217;alternativa pi\u00f9 veloce alla funzione <code>array_merge()<\/code>. Tuttavia, questa caratteristica era limitata agli array con chiave numerica, dato che lo spacchettamento degli array con chiave stringa causava conflitti durante la fusione degli array con chiavi duplicate.<\/p>\n<p>Tuttavia, PHP 8 aveva gi\u00e0 aggiunto il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#named-arguments\">supporto degli argomenti con nome<\/a>, rimuovendo questa limitazione. Quindi, lo spacchettamento degli array ora supporter\u00e0 anche gli array con chiave stringa utilizzando la stessa sintassi:<\/p>\n<pre><code class=\"language-php\">$array = [...$array1, ...$array2];<\/code><\/pre>\n<p>Questo <a href=\"https:\/\/wiki.php.net\/rfc\/array_unpacking_string_keys\">esempio tratto dalla RFC<\/a> illustra come viene gestita la fusione di array con chiavi stringhe duplicate in PHP 8.1:<\/p>\n<pre><code class=\"language-php\">$array1 = [\"a\" =&gt; 1];\n$array2 = [\"a\" =&gt; 2];\n$array = [\"a\" =&gt; 0, ...$array1, ...$array2];\nvar_dump($array); \/\/ [\"a\" =&gt; 2]<\/code><\/pre>\n<p>Qui, la chiave stringa &#8220;a&#8221; appare tre volte prima della fusione tramite lo spacchettamento dell&#8217;array. Ma prevale solo il suo ultimo valore appartenente a <code>$array2<\/code>.<\/p>\n<h3>Notazione Esplicita dei Numeri Ottali<\/h3>\n<p>PHP supporta vari sistemi numerici, tra cui decimale (base-10), binario (base-2), ottale (base-8) ed esadecimale (base-16). Il sistema numerico decimale \u00e8 quello predefinito.<\/p>\n<p>Se volete usare qualsiasi altro sistema numerico, allora dovrete aggiungere ad ogni numero un prefisso standard:<\/p>\n<ul>\n<li><strong>Hex:<\/strong> prefisso <code>0x<\/code>. (es. 17 = <code>0x11<\/code>)<\/li>\n<li><strong>Binary:<\/strong> prefisso <code>0b<\/code>. (es. 3 = <code>0b11<\/code>)<\/li>\n<li><strong>Octal:<\/strong> prefisso <code>0<\/code>. (es. 9 = <code>011<\/code>)<\/li>\n<\/ul>\n<p>Il prefisso del sistema numerico ottale \u00e8 diverso dagli altri. Per standardizzare, molti linguaggi di programmazione stanno aggiungendo il supporto di una notazione numerica ottale esplicita: <code>0o<\/code> o <code>0O<\/code>.<\/p>\n<p>A partire da PHP 8.1, potete riscrivere l&#8217;esempio mostrato sopra (cio\u00e8 il numero 9 in base 10) nel sistema numerico ottale come <code>0o11<\/code> o <code>0O11<\/code>.<\/p>\n<pre><code class=\"language-php\">0o16 === 14; \/\/ true\n0o123 === 83; \/\/ true\n \n0O16 === 14; \/\/ true\n0O123 === 83; \/\/ true\n \n016 === 0o16; \/\/ true\n016 === 0O16; \/\/ true<\/code><\/pre>\n<p>Inoltre, questa nuova caratteristica si adatta anche al <a href=\"https:\/\/wiki.php.net\/rfc\/numeric_literal_separator\">separatore letterale numerico underscore<\/a> introdotto in PHP 7.4.<\/p>\n<p>Si legga la <a href=\"https:\/\/wiki.php.net\/rfc\/explicit_octal_notation\">RFC<\/a> per un approfondimento su questa nuova caratteristica di PHP 8.1.<\/p>\n<h3>Supporto degli Algoritmi di Hash MurmurHash3 e xxHash<\/h3>\n<p>PHP 8.1 aggiunge il supporto degli algoritmi di hashing MurmurHash3 e xxHash. Non sono progettati per l&#8217;uso crittografico, ma forniscono comunque un&#8217;impressionante casualit\u00e0, dispersione e unicit\u00e0 dell&#8217;output.<\/p>\n<p>Questi <a href=\"https:\/\/php.watch\/articles\/php-hash-benchmark\">nuovi algoritmi di hashing sono pi\u00f9 veloci<\/a> della maggior parte degli algoritmi di hashing di PHP. Infatti, alcune varianti di questi algoritmi di hashing sono pi\u00f9 veloci del throughput della RAM.<\/p>\n<p>Dato che PHP 8.1 aggiunge anche la possibilit\u00e0 di dichiarare parametri <code>$options<\/code> specifici per l&#8217;algoritmo, si pu\u00f2 fare lo stesso con questi nuovi algoritmi. Il valore predefinito di questo nuovo parametro \u00e8 <code>[]<\/code>. Quindi, non influenzer\u00e0 nessuna delle nostre funzioni hash esistenti.<\/p>\n<p>Si pu\u00f2 leggere di pi\u00f9 su queste nuove caratteristiche di PHP 8.1 sulle rispettive pagine GitHub: <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6059\">MurmurHash3<\/a>, <a href=\"https:\/\/php.watch\/versions\/8.1\/xxHash\">xxHash<\/a>, <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6400\">$options specifiche dell&#8217;algoritmo<\/a>.<\/p>\n<h3>DNS-over-HTTPS (DoH)<\/h3>\n<p>DNS-over-HTTPS (DoH) \u00e8 un protocollo per la <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-il-dns\/\">risoluzione del DNS<\/a> tramite HTTPS. Utilizzando HTTPS per crittografare i dati tra il client e il resolver DNS, DoH aumenta la privacy e la sicurezza dell&#8217;utente prevenendo gli attacchi MitM.<\/p>\n<p>A partire da PHP 8.1, \u00e8 possibile <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6612\">utilizzare l&#8217;estensione Curl per specificare un server DoH<\/a>. Richiede che PHP sia compilato con le versioni <strong>libcurl<\/strong> 7.62+. Questo non \u00e8 un problema per la maggior parte dei sistemi operativi pi\u00f9 utilizzati, incluse le distro Linux, poich\u00e9 spesso includono Curl 7.68+.<\/p>\n<p>Potete configurare l&#8217;URL del server DoH specificando l&#8217;opzione <code>CURLOPT_DOH_URL<\/code>.<\/p>\n<pre><code class=\"language-php\">$doh = curl_init('https:\/\/kinsta.com');\ncurl_setopt($doh, CURLOPT_DOH_URL, 'https:\/\/dns.google\/dns-query');\ncurl_exec($doh);<\/code><\/pre>\n<p>Nell&#8217;esempio precedente, abbiamo utilizzato il server DNS pubblico di Google. Si noti anche l&#8217;utilizzo di <code>https:\/\/<\/code> in tutti gli URL utilizzati. Assicuratevi di configurarlo perfettamente perch\u00e9 non c&#8217;\u00e8 un server DNS predefinito a cui ricorrere in Curl.<\/p>\n<p>Potete anche scegliere da <a href=\"https:\/\/github.com\/curl\/curl\/wiki\/DNS-over-HTTPS\">una lista di server DoH pubblici<\/a> inclusi nella documentazione di Curl.<\/p>\n<p>Inoltre, il <a href=\"https:\/\/curl.se\/libcurl\/c\/CURLOPT_DOH_URL.html\">riferimento CURLOPT_DOH_URL<\/a> della documentazione di Curl spiega accuratamente come utilizzare i vari argomenti.<\/p>\n<h3>Caricamento di file da stringhe con CURLStringFile<\/h3>\n<p>L&#8217;estensione PHP Curl supporta richieste <a href=\"https:\/\/kinsta.com\/it\/blog\/reindirizzare-http-verso-https\/\">HTTP(S)<\/a> con upload di file. A questo scopo usa la classe <strong>CURLFile<\/strong>, che accetta un URI o un percorso di file, un tipo mime e il nome finale del file.<\/p>\n<p>Tuttavia, con la classe <strong>CURLFile<\/strong>, potete solo accettare il percorso del file o l&#8217;URI, ma non il contenuto del file stesso. Nei casi in cui avevate gi\u00e0 il file da caricare in memoria (ad esempio immagini elaborate, documenti XML, PDF), dovevate utilizzare le URI <code>data:\/\/<\/code> con codifica Base64.<\/p>\n<p>Ma <strong>libcurl<\/strong> supporta gi\u00e0 una soluzione pi\u00f9 semplice per accettare il contenuto del file. La nuova classe <strong>CURLStringFile<\/strong> aggiunge il supporto proprio di questo.<\/p>\n<p>Potete <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6456\">leggere la pagina su GitHub<\/a> se volete saperne come \u00e8 implementato in PHP 8.1.<\/p>\n<h3>Nuova Costante <code>MYSQLI_REFRESH_REPLICA<\/code><\/h3>\n<p>L&#8217;estensione <strong>mysqli<\/strong> di PHP 8.1 aggiunge la nuova costante <code>MYSQLI_REFRESH_REPLICA<\/code>. \u00c8 equivalente alla costante esistente <code>MYSQLI_REFRESH_SLAVE<\/code>.<\/p>\n<p>Questa novit\u00e0 \u00e8 stata apprezzata in <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6632\">MySQL 8.0.23<\/a> per affrontare l&#8217;insensibilit\u00e0 razziale nel vocabolario tecnico (gli esempi pi\u00f9 comuni sono &#8220;slave&#8221; e &#8220;master&#8221;).<\/p>\n<p>Dovreste notare che la vecchia costante non \u00e8 stata rimossa o deprecata. Gli sviluppatori e le applicazioni possono continuare ad usarla. Questa nuova costante \u00e8 solo un&#8217;opzione per sviluppatori e aziende che vogliono lasciarsi alle spalle questa terminologia.<\/p>\n<h3>Miglioramenti delle Prestazioni con la Inheritance Cache<\/h3>\n<p>La <a href=\"https:\/\/github.com\/php\/php-src\/commit\/4b79dba93202ed5640dff317046ce2fdd42e1d82\">Inheritance Cache<\/a> \u00e8 una nuova aggiunta a opcache che elimina l&#8217;overhead dell&#8217;ereditariet\u00e0 delle classi PHP.<\/p>\n<p>Le classi PHP sono compilate e <a href=\"https:\/\/kinsta.com\/it\/blog\/cos-e-la-cache\/\">messe in cache<\/a> da opcache separatamente. Tuttavia, sono gi\u00e0 collegate a run-time su ogni richiesta. Questo processo pu\u00f2 comportare diversi controlli di compatibilit\u00e0 e prendere in prestito metodi\/propriet\u00e0\/constanti da classi madri e tratti.<\/p>\n<p>Di conseguenza, l&#8217;esecuzione richiede molto tempo, anche se il risultato \u00e8 lo stesso per ogni richiesta.<\/p>\n<p>La Inheritance Cache collega tutte le classi dipendenti uniche (genitore, interfacce, tratti, tipi di propriet\u00e0, metodi) e memorizza i risultati nella memoria condivisa opcache. Dato che questo avviene solo una volta, l&#8217;ereditariet\u00e0 richiede un minor numero di istruzioni.<\/p>\n<p>Inoltre, rimuove le limitazioni per le classi immutabili, come le costanti non risolte, le propriet\u00e0 tipizzate e i controlli dei tipi covarianti. Cos\u00ec, tutte le classi memorizzate nella opcache sono immutabili, riducendo ulteriormente il numero di istruzioni richieste.<\/p>\n<p>Tutto sommato, questa novit\u00e0 offre benefici significativi in termini di prestazioni. <a href=\"https:\/\/github.com\/dstogov\">Dimitry Stogov<\/a>, l&#8217;autore di questa patch, ha rilevato un miglioramento dell&#8217;8% sul programma base di Symfony &#8220;Hello, World!&#8221;. Non vediamo l&#8217;ora di testarla nei nostri prossimi <a href=\"https:\/\/kinsta.com\/it\/blog\/benchmark-php\/\">benchmark PHP<\/a>.<\/p>\n<h3>Sintassi Callable di Prima Classe<\/h3>\n<p>PHP 8.1 aggiunge una sintassi callable di prima classe per sostituire le codifiche esistenti che utilizzano stringhe e array. Oltre a creare una <strong>Closure<\/strong> pi\u00f9 pulita, questa nuova sintassi \u00e8 anche accessibile dagli <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-di-revisione-del-codice\/\">strumenti di analisi<\/a> statica e rispetta lo scopo dichiarato.<\/p>\n<p>Ecco alcuni esempi presi dalla <a href=\"https:\/\/wiki.php.net\/rfc\/first_class_callable_syntax\">RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$fn = Closure::fromCallable('strlen');\n$fn = strlen(...);\n \n$fn = Closure::fromCallable([$this, 'method']);\n$fn = $this-&gt;method(...)\n \n$fn = Closure::fromCallable([Foo::class, 'method']);\n$fn = Foo::method(...);<\/code><\/pre>\n<p>Qui tutte le coppie di espressioni sono equivalenti. La sintassi a tre punti (<strong>&#8230;<\/strong>) \u00e8 simile alla sintassi di spacchettamento degli argomenti (<code>...$args<\/code>). Tranne che qui, gli argomenti non sono ancora riempiti.<\/p>\n<h2>Modifiche in PHP 8.1<\/h2>\n<p>PHP 8.1 include anche modifiche alla sintassi e alle funzionalit\u00e0 esistenti. Vediamole insieme:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"7\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>La PHP Interactive Shell Richiede l&#8217;Estensione Readline<\/h3>\n<p>L&#8217;estensione <strong>readline<\/strong> di PHP abilita funzionalit\u00e0 <a href=\"https:\/\/kinsta.com\/it\/blog\/come-utilizzare-ssh\/\">interattive della shell<\/a> come la navigazione, il completamento automatico, l&#8217;editing e altro. Sebbene sia inclusa in PHP, non \u00e8 abilitata di default.<\/p>\n<p>Potete accedere alla shell interattiva di PHP utilizzando l&#8217;opzione a riga di comando <code>-a<\/code> di PHP CLI:<\/p>\n<pre><code class=\"language-php\">php -a\n\nInteractive shell\n\nphp &gt;\nphp &gt; echo \"Hello\";\nHello\nphp &gt; function test() {\nphp { echo \"Hello\";\nphp { }\nphp &gt; test();\nHello<\/code><\/pre>\n<p>Prima di PHP 8.1, si poteva aprire la shell interattiva usando PHP CLI anche senza l&#8217;abilitazione dell&#8217;estensione <strong>readline<\/strong>. Come previsto, le funzionalit\u00e0 interattive della shell non funzionavano, e ci\u00f2 rendeva l&#8217;opzione <code>-a<\/code> priva di significato.<\/p>\n<p>In PHP 8.1 CLI, la shell interattiva esce con un messaggio di errore se <a href=\"https:\/\/github.com\/php\/php-src\/commit\/959e5787bdf7c088a57dce5f4f7570abd7fe35f8\">non avete abilitato l&#8217;estensione readline<\/a>.<\/p>\n<pre><code class=\"language-php\">php -a\nInteractive shell (-a) requires the readline extension.<\/code><\/pre>\n<h3>Modalit\u00e0 di Errore Predefinita di MySQLi Impostata su Exceptions<\/h3>\n<p>Prima di PHP 8.1, <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mysql\/\">MySQLi<\/a> di default rendeva silenti gli errori. Questo comportamento portava spesso ad avere codice che non seguiva una gestione rigorosa degli errori e delle eccezioni. Gli sviluppatori dovevano implementare le proprie funzioni esplicite di gestione degli errori.<\/p>\n<p>PHP 8.1 cambia questo comportamento di MySQLi impostando la modalit\u00e0 predefinita di segnalazione degli errori in modo che venga lanciata un&#8217;eccezione.<\/p>\n<pre><code class=\"language-php\">Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...<\/code><\/pre>\n<p>Trattandosi di un cambiamento radicale, per le versioni di PHP &lt;8.1, \u00e8 necessario impostare esplicitamente la modalit\u00e0 di gestione degli errori utilizzando la funzione <code>mysqli_report<\/code> prima di effettuare la prima connessione a MySQLi. In alternativa, potete fare lo stesso selezionando il valore di segnalazione degli errori con un&#8217;istanza di <code>mysqli_driver<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_default_errmode\">La RFC<\/a> segue una <a href=\"https:\/\/wiki.php.net\/rfc\/pdo_default_errmode\">modifica simile introdotta in PHP 8.0<\/a>.<\/p>\n<h3>Fine Riga Personalizzabile per le Funzioni di Scrittura CSV<\/h3>\n<p>Prima di PHP 8.1, le funzioni di scrittura <a href=\"https:\/\/kinsta.com\/changelog\/export-redirects-csv\/\">CSV<\/a> incorporate in PHP, <code>fputcsv<\/code> e <code>SplFileObject::fputcsv<\/code>, aggiungevano <code>\\n<\/code> (o il carattere Line-Feed) alla fine di ogni riga.<\/p>\n<p>PHP 8.1 aggiunge a queste funzioni il supporto di un nuovo parametro chiamato <code>eol<\/code>. Potete utilizzarlo per passare un carattere di fine riga configurabile. Di default usa ancora il carattere <code>\\n<\/code>. Quindi, potete continuare ad usarlo nel vostro attuale codice.<\/p>\n<p>Per i caratteri di fine riga si applicano le regole standard di escape dei caratteri. Se volete utilizzare <code>\\r<\/code>, <code>\\n<\/code>, o <code>\\r\\n<\/code> come caratteri di EOL, dovete racchiuderli in doppi apici.<\/p>\n<p>Ecco la <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6403\">pagina GitHub<\/a> che traccia questa novit\u00e0.<\/p>\n<h3>Nuove Restrizioni per l&#8217;Operatore <code>version_compare<\/code><\/h3>\n<p>La funzione <code>version_compare()<\/code> di PHP confronta due stringhe di numeri di versione. Questa funzione accetta un terzo argomento facoltativo chiamato <code>operator<\/code> per testare una particolare relazione.<\/p>\n<p>Sebbene non sia trattato esplicitamente nella documentazione, prima di PHP 8.1, si poteva impostare questo parametro su un valore parziale (ad esempio <code>g<\/code>, <code>l<\/code>, <code>n<\/code>) senza incorrere in un errore.<\/p>\n<p>PHP 8.1 aggiunge restrizioni pi\u00f9 severe all&#8217;argomento <code>operator<\/code> della funzione <code>version_compare()<\/code> per superare questa situazione. Gli unici operatori che ora si possono utilizzare sono:<\/p>\n<ul>\n<li><strong>==<\/strong>, <strong>=<\/strong>, e <strong>eq<\/strong><\/li>\n<li><strong>!=<\/strong>, <strong>&lt;&gt;<\/strong>, e <strong>ne<\/strong><\/li>\n<li><strong>&gt;<\/strong> e <strong>gt<\/strong><\/li>\n<li><strong>&gt;=<\/strong> e <strong>ge<\/strong><\/li>\n<li><strong>&lt;<\/strong> e <strong>lt<\/strong><\/li>\n<li><strong>&lt;=<\/strong> e <strong>le<\/strong><\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/6510\">Niente pi\u00f9 valori parziali dell&#8217;operatore<\/a>.<\/p>\n<h3>Le Funzioni di Encoding e Decoding HTML ora Usano <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code><\/h3>\n<p>Le entit\u00e0 HTML sono rappresentazioni testuali di caratteri che altrimenti verrebbero interpretati come HTML. Pensate a caratteri come <code>&lt;<\/code> e <code>&gt;<\/code> utilizzati per <a href=\"https:\/\/kinsta.com\/it\/blog\/best-practice-html\/\">definire i tag HTML<\/a> (per esempio <code>&lt;a&gt;<\/code>, <code>&lt;h3&gt;<\/code>, <code>&lt;script&gt;<\/code>).<\/p>\n<p>L&#8217;entit\u00e0 HTML per <code>&lt;<\/code> \u00e8 <code>& lt;<\/code>\u00a0(simbolo minore di) e <code>&gt;<\/code> \u00e8 <code>& gt;<\/code>\u00a0(simbolo maggiore di). Potete usare queste entit\u00e0 HTML in modo sicuro in un documento HTML senza innescare il motore di rendering del browser.<\/p>\n<p><strong>Nota:<\/strong> Rimuovete lo spazio tra &#8220;&#038;&#8221; e &#8220;amp&#8221;.<\/p>\n<p>Potete usare queste entit\u00e0 HTML in modo sicuro in un documento HTML senza innescare il motore di rendering del browser.<\/p>\n<p>Ad esempio, <code>& lt;script& gt;<\/code> sar\u00e0 visualizzato come <code>&lt;script&gt;<\/code> nel browser, invece di essere interpretato come un tag HTML.<\/p>\n<p>Prima di PHP 8.1, le funzioni <a href=\"https:\/\/www.php.net\/manual\/function.htmlspecialchars.php\">htmlspecialchars()<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/function.htmlentities.php\">htmlentities()<\/a> convertivano simboli come <code><strong>\"<\/strong><\/code>, <code>&lt;<\/code> , <code>&gt;<\/code> , e <code>&<\/code> nelle loro rispettive entit\u00e0 HTML. Ma di default non convertivano il carattere delle virgolette singole (<code><strong>'<\/strong><\/code>) nella sua entit\u00e0 HTML. Inoltre, restituivano una stringa vuota se c&#8217;era un UTF-8 malformato nel testo.<\/p>\n<p>In PHP 8.1., queste funzioni di codifica e decodifica HTML (e le loro funzioni correlate) di default <a href=\"https:\/\/github.com\/php\/php-src\/commit\/50eca61f68815005f3b0f808578cc1ce3b4297f0\">convertiranno anche i caratteri delle virgolette singole<\/a> nella loro entit\u00e0 HTML.<\/p>\n<p>E se il testo dato contiene caratteri non validi, le funzioni li sostituiranno con un carattere di sostituzione Unicode (\ufffd) invece di restituire una stringa vuota. Tutto questo avviene da PHP 8.1 cambiando le firme di queste funzioni in <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code> piuttosto che <code>ENT_COMPAT<\/code>.<\/p>\n<p>La maggior parte dei framework usa gi\u00e0 <code>ENT_QUOTES<\/code> come valore predefinito del flag. Quindi, non vedrete molte differenze da questa modifica. Tuttavia, il nuovo flag <code>ENT_SUBSTITUTE<\/code> non \u00e8 molto usato. PHP 8.1 far\u00e0 s\u00ec che i caratteri UTF-8 non validi vengano sostituiti con il carattere \ufffd invece di restituire una stringa vuota.<\/p>\n<h3>Avviso su Chiamate Illegali di Funzioni Compatte<\/h3>\n<p>La funzione <code>compact()<\/code> di PHP \u00e8 davvero utile. Potete utilizzarla per creare un array con le variabili usando i rispettivi nomi e valori.<\/p>\n<p>Considerate, ad esempio, il seguente codice:<\/p>\n<pre><code class=\"language-php\">$animal = 'Cat';\n$sound = 'Meow';\n$region = 'Istanbul';\ncompact('animal', 'sound', 'region');\n\/\/ ['animal' =&gt; \"Cat\", 'sound' =&gt; \"Meow\", 'region' =&gt; \"Istanbul\"]<\/code><\/pre>\n<p>La <a href=\"https:\/\/www.php.net\/manual\/en\/function.compact.php\">documentazione della funzione compact<\/a> afferma che questa accetta solo parametri stringa o array con valori stringa. Tuttavia, prima di PHP 7.3, qualsiasi stringa che non \u00e8 impostata sarebbe stata silenziosamente saltata.<\/p>\n<p>PHP 7.3 ha modificato la funzione <code>compact()<\/code> in modo che venga emesso una nota quando si usano variabili non definite. <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\">PHP 8.1 fa un passo avanti<\/a> e lancia un avviso.<\/p>\n<p>Si <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\">legga la pagina GitHub<\/a> per capire come si \u00e8 giunti a questa modifica.<\/p>\n<h3>Nuove Migrazioni da Risorse a Oggetti di Classe<\/h3>\n<p>Uno degli obiettivi a lungo termine di PHP \u00e8 quello di allontanarsi <a href=\"https:\/\/php.watch\/articles\/resource-object\">dalle risorse per muoversi verso oggetti di classe standard<\/a>.<\/p>\n<p>Per ragioni storiche, gli oggetti risorsa sono utilizzati ampiamente nelle applicazioni PHP. Quindi, la migrazione delle risorse agli oggetti di classe deve essere il meno distruttiva possibile. PHP 8.1 migra cinque di queste risorse:<\/p>\n<h4>La Risorsa <code>file_info<\/code> Migrata agli Oggetti <code>finfo<\/code><\/h4>\n<p>La <a href=\"https:\/\/www.php.net\/manual\/en\/class.finfo.php\">classe finfo<\/a> di PHP offre un&#8217;interfaccia <a href=\"https:\/\/kinsta.com\/it\/blog\/programmazione-orientata-agli-oggetti-python\/#what-is-objectoriented-programming-in-python\">orientata agli oggetti<\/a> per le funzioni <code>fileinfo<\/code>. Tuttavia, l&#8217;utilizzo delle funzioni <code>finfo<\/code> restituisce oggetti <code>resource<\/code> con il tipo <code>file_info<\/code> invece che un&#8217;istanza della classe <code>finfo<\/code> stessa.<\/p>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/5987\">PHP 8.1 risolve questa anomalia<\/a>.<\/p>\n<h4>Risorse IMAP Migrate in oggetti di classe <code>IMAP\\Connection<\/code><\/h4>\n<p>In linea con l&#8217;obiettivo della migrazione da risorsa a oggetto, la nuova classe <code>IMAP\\Connection<\/code> minimizza i potenziali cambiamenti di rottura quando PHP modificher\u00e0 eventualmente i dettagli di implementazione della classe.<\/p>\n<p>Questa nuova classe \u00e8 anche dichiarata <code>final<\/code>, quindi non \u00e8 permesso <code>extend<\/code>.<\/p>\n<p>Si legga di pi\u00f9 sulla sua implementazione sulla <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6418\">pagina GitHub<\/a>.<\/p>\n<h4>Le Risorse di Connessione FTP Sono ora Oggetti di Classe <code>FTP\\Connection<\/code><\/h4>\n<p>In PHP &lt;8.1, se si crea una <a href=\"https:\/\/kinsta.com\/it\/blog\/migliori-client-ftp\/\">connessione FTP<\/a> con le funzioni <code>ftp_connect()<\/code> o <code>ftp_ssl_connect()<\/code>, si ottiene un oggetto <strong>risorsa<\/strong> di tipo <strong>ftp<\/strong>.<\/p>\n<p>Per rimediare, PHP 8.1 aggiunge la nuova classe <code>FTP\\Connection<\/code>. E come per la classe <code>IMAP\\Connection<\/code>, \u00e8 anche dichiarata <code>final<\/code> per evitare che venga estesa.<\/p>\n<p>Si pu\u00f2 approfondire sull&#8217;<a href=\"https:\/\/github.com\/php\/php-src\/commit\/b4503fbf882e490f16d85915e83173bd1e414e84\">implementazione<\/a> nella pagina GitHub.<\/p>\n<h4>Identificatori di Font Migrati in Oggetti di Classe <code>GdFont<\/code><\/h4>\n<p>L&#8217;estensione GD di PHP fornisce la <a href=\"https:\/\/www.php.net\/manual\/en\/function.imageloadfont.php\">funzione imageloadfont()<\/a> per caricare una bitmap definita dall&#8217;utente e restituire il suo ID di risorsa font-identifier (un intero).<\/p>\n<p>In PHP 8.1, questa funzione restituir\u00e0 invece un&#8217;istanza della classe <strong>GdFont<\/strong>. Inoltre, per far s\u00ec che la migrazione avvenga senza problemi, tutte le funzioni che prima accettavano un ID risorsa da <code>imageloadfont()<\/code> ora prenderanno i nuovi oggetti di classe <strong>GdFont.<\/strong><\/p>\n<p>Si legga anche la <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bc40bce868e208fa2d7af950845759d3ef498b5d\">pagina GitHub<\/a>.<\/p>\n<h4>Risorse LDAP Migrate a Oggetti<\/h4>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/intro.ldap.php\">LDAP<\/a>, o Lightweight Directory Access Protocol, \u00e8 utilizzato per accedere a &#8220;Directory Servers&#8221;. Come una struttura di directory su disco rigido, \u00e8 un database unico che contiene dati in una struttura ad albero.<\/p>\n<p>PHP include un&#8217;estensione LDAP che accettava o restituiva oggetti <strong>resource<\/strong> prima di PHP 8.1. Tuttavia, ora sono tutti migrati senza problemi alle nuove istanze di classe. I tipi di <strong>resource<\/strong> che sono stati migrati sono:<\/p>\n<ul>\n<li>risorsa <code>ldap link<\/code> all&#8217;oggetto di classe <code>\\LDAP\\Connection<\/code><\/li>\n<li>risorsa <code>ldap result<\/code> all&#8217;oggetto di classe <code>\\LDAP\\Result<\/code><\/li>\n<li>risorsa <code>ldap result entry<\/code> all&#8217;oggetto di classe <code>\\LDAPResultEntry<\/code><\/li>\n<\/ul>\n<p>Si legga la <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6770\">pagina GitHub<\/a> per informazioni pi\u00f9 dettagliate su questa migrazione.<\/p>\n<h4>Le Risorse Pspell Sono Ora Oggetti di Classe<\/h4>\n<p>L&#8217;<a href=\"https:\/\/www.php.net\/manual\/en\/intro.pspell.php\">estensione Pspell<\/a> di PHP permette di controllare l&#8217;ortografia e i suggerimenti di parole.<\/p>\n<p>PHP &lt;8.1 utilizzava i tipi di oggetti risorsa <code>pspell<\/code> e <code>pspell config<\/code> con un identificatore intero. Questi due oggetti risorsa sono ora sostituiti da oggetti di classe <code>PSpell\\Dictionary<\/code> e <code>PSpell\\Config<\/code>.<\/p>\n<p>Come le migrazioni precedenti, <a href=\"https:\/\/php.watch\/versions\/8.1\/PSpell-resource#PSpell-Dictionary\">tutte le funzioni Pspell<\/a> che prima accettavano o restituivano identificatori di oggetti risorsa prenderanno le nuove istanze di oggetti di classe.<\/p>\n<p>Si faccia riferimento alla <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bd12c94f46438dad03d1d3c02fff37b9b950ae6f\">pagina GitHub<\/a> per maggiori informazioni.<\/p>\n<h2>Deprecazioni in PHP 8.1<\/h2>\n<p>PHP 8.1 depreca molte delle precedenti funzionalit\u00e0. Il seguente elenco fornisce una breve panoramica delle funzionalit\u00e0 deprecate a partire da PHP 8.1:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"10\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Impossibile Passare <code>null<\/code> a Parametri di Funzioni Interne Non-Nullable<\/h3>\n<p>A partire da PHP 8.0, le funzioni interne accettano in modo silente valori <code>null<\/code> anche per argomenti non-nullable. Lo stesso non vale per le funzioni definite dall&#8217;utente &#8211; queste accettano <code>null<\/code> solo per gli argomenti nullable.<\/p>\n<p>Si consideri questo esempio:<\/p>\n<pre><code class=\"language-php\">var_dump(<strong>str_contains<\/strong>(\"foobar\", null));\n\/\/ bool(<strong>true<\/strong>)<\/code><\/pre>\n<p>Qui, il valore <code>null<\/code> viene silentemente convertito in una stringa vuota. Cos\u00ec, il risultato \u00e8 <code>true<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_null_to_scalar_internal_arg\">Questa RFC<\/a> mira a uniformare il comportamento delle funzioni interne in modo che venga lanciato un avviso di deprecazione.<\/p>\n<pre><code class=\"language-php\">var_dump(str_contains(\"foobar\", null));\n\/\/ Deprecated: Passing null to argument of type string is deprecated<\/code><\/pre>\n<p>La deprecazione diventer\u00e0 un TypeError nella prossima major version di PHP (cio\u00e8 PHP &gt;=9.0), rendendo il comportamento delle funzioni interne coerente con le funzioni definite dall&#8217;utente.<\/p>\n<h3>Uso Ristretto di <code>$GLOBALS<\/code><\/h3>\n<p>La variabile <code>$GLOBALS<\/code> di PHP fornisce un riferimento diretto alla tabella interna dei simboli. Supportare questa funzionalit\u00e0 \u00e8 complesso e influisce sulle prestazioni delle operazioni sugli array. Inoltre, era utilizzato raramente.<\/p>\n<p>Come da <a href=\"https:\/\/wiki.php.net\/rfc\/restrict_globals_usage\">RFC<\/a>, ora non \u00e8 pi\u00f9 permesso modificare indirettamente <code>$GLOBALS<\/code>. Questa modifica non \u00e8 retrocompatibile.<\/p>\n<p>L&#8217;impatto \u00e8 relativamente basso:<\/p>\n<blockquote><p><em>Nei primi 2k pacchetti di composer ho trovato <\/em><a href=\"https:\/\/gist.github.com\/nikic\/9fd95866f9811b349b947f63214ad7a9\"><em>23 casi in cui si utilizza $GLOBALS<\/em><\/a> senza dereferenziarlo direttamente. Sulla base di un&#8217;ispezione sommaria, ci sono solo due casi in cui <strong>$GLOBALS<\/strong> non \u00e8 usato in sola lettura.<\/p><\/blockquote>\n<p>Tuttavia, l&#8217;utilizzo in sola lettura di <code>$GLOBALS<\/code> continua a funzionare come al solito. Ci\u00f2 che non \u00e8 pi\u00f9 supportato \u00e8 la scrittura su <code>$GLOBALS<\/code> nel suo complesso. Come risultato, ci si pu\u00f2 aspettare un leggero <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-test-prestazioni\/\">miglioramento delle prestazioni<\/a>, specialmente quando si lavora con gli array ordinari di PHP.<\/p>\n<h3>Dichiarazioni Tipi di Ritorno per Funzioni Interne<\/h3>\n<p>PHP 8.0 ha permesso agli sviluppatori di dichiarare parametri e tipi di ritorno per la maggior parte delle funzioni e dei metodi interni. Questo \u00e8 stato possibile grazie a varie RFC come gli <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#type-errors-internal-functions\">errori di tipo coerenti per le funzioni interne<\/a>, <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#union-types-2-0\">Union Types 2.0<\/a> e <a href=\"https:\/\/wiki.php.net\/rfc\/mixed_type_v2\">Mixed Type v2<\/a>.<\/p>\n<p>Tuttavia, ci sono molti casi in cui le informazioni sul tipo possono mancare. Questi includono un tipo con risorse, parametri <strong>out<\/strong> pass-by-ref, tipo di ritorno di metodi non finali e funzioni o metodi che non analizzano i parametri secondo le regole generali. Per i dettagli, si faccia riferimento alla <a href=\"https:\/\/wiki.php.net\/rfc\/internal_method_return_types\">RFC<\/a>.<\/p>\n<p>Questa RFC affronta solo il problema del tipo di ritorno dei metodi non finali. Tuttavia, piuttosto che eliminarli del tutto immediatamente, il team di PHP stabilisce un percorso di migrazione graduale per permettere di aggiornare i codebase con i relativi tipi di ritorno dei metodi.<\/p>\n<p><em>I tipi di ritorno dei metodi interni non deprecati &#8211; quando possibile &#8211; sono dichiarati in modo provvisorio in PHP 8.1, e diventeranno obbligatori in PHP 9.0. Significa che nelle versioni di PHP 8.x, un avviso &#8220;deprecato&#8221; viene sollevato durante i controlli di ereditariet\u00e0 quando un metodo interno viene sovrascritto in modo che i tipi di ritorno siano incompatibili e PHP 9.0 li render\u00e0 un errore fatale.<\/em><\/p>\n<p>Se vedete questo avviso di deprecazione dopo l&#8217;aggiornamento a PHP 8.1, assicuratevi di aggiornare i tipi di ritorno dei vostri metodi.<\/p>\n<h3>Interfaccia Serializzabile Deprecata<\/h3>\n<p>PHP 7.4 ha introdotto il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-7-4\/#serialization\">meccanismo di serializzazione degli oggetti personalizzati<\/a> con due nuovi metodi magici:<code> __serialize()<\/code> e <code>__unserialize()<\/code>. Questi nuovi metodi mirano a sostituire l&#8217;interfaccia <strong>Serializable<\/strong> interrotta.<\/p>\n<p>Questa <a href=\"https:\/\/wiki.php.net\/rfc\/phase_out_serializable\">RFC propone<\/a> di finalizzare quella decisione stabilendo un piano per la rimozione finale di <strong>Serializable<\/strong>.<\/p>\n<p>In PHP 8.1, se implementate l&#8217;interfaccia <strong>Serializable<\/strong> senza implementare i metodi <code>__serialize()<\/code> e <code>__unserialize()<\/code>, PHP lancia un avvertimento &#8220;Deprecated&#8221;.<\/p>\n<pre><code class=\"language-php\">Deprecated: The Serializable interface is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line ...<\/code><\/pre>\n<p>Se supportate <strong>PHP &lt;7.4<\/strong> e <strong>PHP &gt;=7.4<\/strong>, dovreste implementare sia l&#8217;interfaccia <strong>Serializable<\/strong> che i nuovi metodi magici. Nelle versioni di <strong>PHP &gt;=7.4<\/strong>, i metodi magici avranno la precedenza.<\/p>\n<h3>Deprecate le Conversioni da <code>float<\/code> a <code>int<\/code> non Compatibili<\/h3>\n<p>PHP \u00e8 un linguaggio tipizzato dinamicamente. Come tale, ci sono molti casi in cui la coercizione dei tipi si verifica naturalmente. La maggior parte di queste coercizioni sono innocue ed estremamente comode.<\/p>\n<p>Tuttavia, quando un numero <strong>float<\/strong> viene convertito in un <strong>integer<\/strong>, spesso si ha una perdita di dati. Per esempio, quando il float <strong>3.14<\/strong> viene convertito in un intero <strong>3<\/strong>, perde il suo valore frazionario.<\/p>\n<p>Lo stesso accade quando il float \u00e8 al di fuori dell&#8217;intervallo di interi della piattaforma, o quando una stringa float viene convertita in un intero.<\/p>\n<p>PHP 8.1 rettifica questo comportamento e porta la coercizione dinamica dei tipi pi\u00f9 in linea con la maggior parte dei linguaggi di programmazione moderni. L&#8217;obiettivo \u00e8 di rendere tali coercizioni prevedibili e intuitive.<\/p>\n<p>In PHP 8.1, vedrete un avviso di deprecazione quando un <strong>float<\/strong> non compatibile \u00e8 implicitamente forzato a <strong>int<\/strong>. Ma cosa costituisce un float compatibile con un intero? La <a href=\"https:\/\/wiki.php.net\/rfc\/implicit-float-int-deprecate\">RFC<\/a> risponde cos\u00ec:<\/p>\n<p><em>Un float si dice compatibile con gli interi se possiede le seguenti caratteristiche:<\/em><\/p>\n<ul>\n<li><em>\u00c8 un numero (cio\u00e8 non NaN o Infinito)<\/em><\/li>\n<li><em>\u00c8 nell&#8217;intervallo di un intero PHP (dipende dalla piattaforma)<\/em><\/li>\n<li><em>Non ha parte frazionaria<\/em><\/li>\n<\/ul>\n<p>Questo avviso di deprecazione si trasformer\u00e0 in un <strong>TypeError<\/strong> nella prossima major release di PHP (cio\u00e8 la 9.0).<\/p>\n<h3>Deprecati Il Metodo <code>mysqli::get_client_info<\/code> e <code>mysqli_get_client_info($param)<\/code><\/h3>\n<p>L&#8217;API del client MySQL definisce due costanti: <code>client_info<\/code> (string) e <code>client_version<\/code> (int). MySQL Native Driver (MySQLnd) \u00e8 parte del sorgente ufficiale di PHP e lega queste costanti alla versione di PHP. In libmysql, queste rappresentano la versione della libreria client al momento della compilazione.<\/p>\n<p>Prima di PHP 8.1, mysqli esponeva queste costanti in 4 modi: propriet\u00e0 <code>mysqli_driver<\/code>, propriet\u00e0 <code>mysqli<\/code>, funzione <code>mysqli_get_client_info()<\/code> e metodo <code>mysqli::get_client_info<\/code>. Ma non c&#8217;\u00e8 un metodo per <code>client_version<\/code>.<\/p>\n<p>MySQLnd espone queste costanti a PHP in 2 modi: una costante e una chiamata di funzione. Per unificare i metodi di accesso di mysqli con queste stesse due opzioni, PHP 8.1 depreca queste altre due opzioni:<\/p>\n<ul>\n<li>metodo <code>get_client_info<\/code> nella classe <strong>mysqli<\/strong>. Al suo posto potete semplicemente usare la funzione <code>mysqli_get_client_info()<\/code>.<\/li>\n<li><code>mysqli_get_client_info()<\/code> con parametri. Invocate la funzione senza parametri per evitare l&#8217;avviso di deprecazione.<\/li>\n<\/ul>\n<p>Si legga la <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6777\">pagina GitHub<\/a>.<\/p>\n<h3>Sono Deprecate Tutte le Funzioni <code>mhash*()<\/code> (Estensione hash)<\/h3>\n<p>PHP 5.3 aveva integrato le funzioni <code>mhash*()<\/code> in <code>ext\/hash<\/code> come livello di compatibilit\u00e0 per <code>ext\/mhash<\/code>. Pi\u00f9 tardi, PHP 7.0 aveva rimosso <code>ext\/mhash<\/code>.<\/p>\n<p>A differenza delle funzioni <code>hash_*()<\/code>, le funzioni <code>mhash*()<\/code> non sono sempre disponibili. Bisogna abilitarle separatamente durante la configurazione di PHP.<\/p>\n<p>In PHP 7.4, l&#8217;estensione hash \u00e8 stata distribuita insieme a PHP, diventando un&#8217;estensione predefinita di PHP. Tuttavia, supportava ancora l&#8217;abilitazione dell&#8217;opzione <code>--enable-mhash<\/code> per ragioni di compatibilit\u00e0.<\/p>\n<p>Il team di PHP ha deciso di <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#mhash_function_family\">deprecare le funzioni mhash*()<\/a> a partire da PHP 8.1 e di rimuoverle del tutto in PHP 9.0. Le funzioni deprecate sono <code>mhash()<\/code>, <code>mhash_keygen_s2k()<\/code>, <code>mhash_count()<\/code>, <code>mhash_get_block_size()<\/code> e <code>mhash_get_hash_name()<\/code>. Al loro posto \u00e8 possibile utilizzare le funzionalit\u00e0 standard di <code>ext\/hash<\/code>.<\/p>\n<h3>Deprecate Entrambe le Impostazioni INI <code>filter.default<\/code> e <code>filter.default_options<\/code><\/h3>\n<p>Le impostazioni INI <code>filter.default<\/code> di PHP permettono di applicare un filtro a tutti i superglobal, cio\u00e8 i dati GPCRS (<code>$_GET<\/code>, <code>$_POST<\/code>, <code>$_COOKIE<\/code>, <code>$_REQUEST<\/code> e <code>$_SERVER<\/code>).<\/p>\n<p>Ad esempio, potete impostare <code>filter.default=magic_quotes<\/code> o <code>filter.default=add_slashes<\/code> (in base alla versione di PHP) per far risorgere la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magic_quotes\">controversa e insicura funzionalit\u00e0 delle magic quotes<\/a> di PHP (rimossa in PHP 5.4).<\/p>\n<p>L&#8217;impostazione INI <code>filter.default<\/code> offre funzionalit\u00e0 aggiuntive permettendo l&#8217;utilizzo di molti pi\u00f9 filtri, peggiorando le cose ancora di pi\u00f9. Ad esempio, un&#8217;altra opzione &#8211; <code>filter.default=special_chars<\/code> &#8211; abilita le virgolette magiche solo per l&#8217;HTML. C&#8217;\u00e8 minore consapevolezza di queste impostazioni.<\/p>\n<p>A partire da PHP 8.1 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#filterdefault_ini_setting\">sar\u00e0 emesso un avviso di deprecazione<\/a> se <code>filter.default<\/code> \u00e8 impostato su qualsiasi valore diverso da <code>unsafe_raw<\/code> (il valore predefinito). Non vedrete nessun avviso di deprecazione separato per <code>filter.default_options<\/code>, ma entrambe queste impostazioni INI saranno rimosse a partire da PHP 9.0.<\/p>\n<p>In alternativa, potete iniziare ad utilizzare la funzione <a href=\"https:\/\/www.php.net\/manual\/en\/function.filter-var.php\">filter_var()<\/a>. Questa filtra le variabili con il filtro specificato.<\/p>\n<h3>Deprecato <code>autovivification<\/code> su false<\/h3>\n<p>PHP permette l&#8217;autovivificazione (autocreazione di array da valori falsi). Questa funzionalit\u00e0 \u00e8 molto utile se la variabile \u00e8 indefinita.<\/p>\n<p>Ma creare automaticamente un array quando il valore \u00e8 falso o nullo non \u00e8 l&#8217;ideale.<\/p>\n<p>Questa <a href=\"https:\/\/wiki.php.net\/rfc\/autovivification_false\">RFC non permette l&#8217;autovivificazione<\/a> da valori falsi. Si noti, per\u00f2, che l&#8217;autovivificazione da variabili indefinite e nulle \u00e8 ancora consentita.<\/p>\n<p>A partire da PHP 8.1, accodare a una variabile di tipo false causa l&#8217;emissione un avviso di deprecazione:<\/p>\n<pre><code class=\"language-php\">Deprecated: Automatic conversion of false to array is deprecated in<\/code><\/pre>\n<p>PHP 9.0 emetter\u00e0 un errore fatale, cosa che \u00e8 identica per altri tipi scalari.<\/p>\n<h3>Deprecata La Propriet\u00e0 <code>mysqli_driver-&gt;driver_version<\/code><\/h3>\n<p>La propriet\u00e0 <strong>mysqli_driver-&gt;driver_version<\/strong> dell&#8217;estensione MySQLi non viene aggiornata da 13 anni. Nonostante i molti cambiamenti al driver apportati da allora, questa restituisce ancora il vecchio valore della versione del driver, e ci\u00f2 rende questa propriet\u00e0 priva di significato.<\/p>\n<p>Da PHP 8.1, la <a href=\"https:\/\/github.com\/php\/php-src\/commit\/3dfd3558ca2f63f\">propriet\u00e0 mysqli_driver-&gt;driver_version \u00e8 deprecata<\/a>.<\/p>\n<h2>Altre Modifiche Minori<\/h2>\n<p>Ci sono <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1\">molte altre deprecazioni in PHP 8.1<\/a>. Elencarle tutte qui sarebbe estenuante. Consigliamo di controllare direttamente l&#8217;RFC per queste deprecazioni minori.<\/p>\n<p>La pagina GitHub di PHP contiene una guida <a href=\"https:\/\/github.com\/php\/php-src\/blob\/master\/UPGRADING\">PHP 8.1 UPGRADE NOTES<\/a>. Questa elenca tutte le modifiche di cui dovreste tener conto prima di aggiornare a PHP 8.1.<\/p>\n\n<h2>Riepilogo<\/h2>\n<p>Non manca molto a PHP 8.1 e promette gi\u00e0 di superare il <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/\">suo predecessore<\/a>, il che non \u00e8 una cosa da poco. Pensiamo che le funzionalit\u00e0 pi\u00f9 entusiasmanti di PHP 8.1 siano Enums, Fibers, Pure Intersection Types e i miglioramenti delle prestazioni. Non vediamo l&#8217;ora di mettere PHP 8.1 alla prova e fare il benchmark dei vari <a href=\"https:\/\/kinsta.com\/it\/blog\/framework-php\/\">framework PHP<\/a> e dei <a href=\"https:\/\/kinsta.com\/it\/quota-di-mercato-di-wordpress\/\">CMS<\/a>.<\/p>\n<p>Salvate questo post tra preferiti come futuro riferimento.<\/p>\n<p><em>Quale funzionalit\u00e0 di PHP 8.1 preferite? Condividete le vostre considerazioni con la community nella sezione dei commenti.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.1 \u00e8 finalmente arrivato, e ci porter\u00e0 altre funzionalit\u00e0 interessanti. Il suo rilascio \u00e8 previsto per la fine di quest&#8217;anno, il 25 novembre 2021. In &#8230;<\/p>\n","protected":false},"author":117,"featured_media":47275,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[41,25650],"topic":[26188],"class_list":["post-47267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-php-8-1","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>Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro<\/title>\n<meta name=\"description\" content=\"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c&#039;\u00e8 tutto!\" \/>\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-1\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro\" \/>\n<meta property=\"og:description\" content=\"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c&#039;\u00e8 tutto!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\" \/>\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=\"2021-09-01T13:26:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-03-14T12:37:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c&#039;\u00e8 tutto!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"36 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-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro\",\"datePublished\":\"2021-09-01T13:26:39+00:00\",\"dateModified\":\"2023-03-14T12:37:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\"},\"wordCount\":7169,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\",\"keywords\":[\"php\",\"php 8.1\"],\"articleSection\":[\"Sviluppo Web\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\",\"name\":\"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\",\"datePublished\":\"2021-09-01T13:26:39+00:00\",\"dateModified\":\"2023-03-14T12:37:05+00:00\",\"description\":\"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c'\u00e8 tutto!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png\",\"width\":1460,\"height\":730,\"caption\":\"Cosa c'\u00e8 di nuovo in PHP 8.1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#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\":\"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro\"}]},{\"@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\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro","description":"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c'\u00e8 tutto!","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-1\/","og_locale":"it_IT","og_type":"article","og_title":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro","og_description":"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c'\u00e8 tutto!","og_url":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2021-09-01T13:26:39+00:00","article_modified_time":"2023-03-14T12:37:05+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c'\u00e8 tutto!","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Salman Ravoof","Tempo di lettura stimato":"36 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro","datePublished":"2021-09-01T13:26:39+00:00","dateModified":"2023-03-14T12:37:05+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/"},"wordCount":7169,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","keywords":["php","php 8.1"],"articleSection":["Sviluppo Web"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/php-8-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/","url":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/","name":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","datePublished":"2021-09-01T13:26:39+00:00","dateModified":"2023-03-14T12:37:05+00:00","description":"Scopri le novit\u00e0 di PHP 8.1. Nuove funzionalit\u00e0, miglioramenti delle prestazioni, modifiche, deprecazioni. In questo articolo c'\u00e8 tutto!","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/php-8-1\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2021\/09\/php-8.1.png","width":1460,"height":730,"caption":"Cosa c'\u00e8 di nuovo in PHP 8.1"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#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":"Le Novit\u00e0 di PHP 8.1: Funzionalit\u00e0, Modifiche, Miglioramenti e Altro"}]},{"@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\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47267","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\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=47267"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47267\/revisions"}],"predecessor-version":[{"id":66863,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/47267\/revisions\/66863"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/it"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/es"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/translations\/nl"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/47267\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/47275"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=47267"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=47267"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=47267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}