{"id":58933,"date":"2022-08-11T13:23:08","date_gmt":"2022-08-11T12:23:08","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=58933&#038;preview=true&#038;preview_id=58933"},"modified":"2023-01-04T11:01:39","modified_gmt":"2023-01-04T10:01:39","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/","title":{"rendered":"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro"},"content":{"rendered":"<p>PHP 8.2 si fonda sulla base rinnovata da <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/\">PHP 8.0<\/a> e <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/\">PHP 8.1<\/a>.\u00a0Ora che \u00e8 stato rilasciato <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a>, analizziamo in dettaglio le novit\u00e0: dalle nuove funzionalit\u00e0, ai miglioramenti, alle deprecazioni e alle tante modifiche minori, analizziamo tutto.<\/p>\n<p>Dal momento che PHP 8.2 \u00e8 stato congelato il 19 luglio 2022, non ci si pu\u00f2 aspettare alcuna aggiunta significativa a questo elenco.<\/p>\n<p>Curiosi? Anche noi lo siamo.<\/p>\n<p>Iniziamo!<\/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 e Miglioramenti di PHP 8.2<\/h2>\n<p>Iniziamo con l&#8217;esplorare tutte le novit\u00e0 di PHP 8.2. Si tratta di un elenco piuttosto ampio:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Nuove Classi <code>readonly<\/code><\/h3>\n<p>PHP 8.1 ha introdotto la <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#new-readonly-properties\">funzione<code>readonly<\/code> per le propriet\u00e0 delle classi<\/a>. Ora, PHP 8.2 aggiunge il supporto per <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">dichiarare l&#8217;intera classe come <code>readonly<\/code>.<\/a><\/p>\n<p>Se dichiarate una classe come <code>readonly<\/code>, tutte le sue propriet\u00e0 erediteranno automaticamente la funzione <code>readonly<\/code>. Pertanto, dichiarare una classe <code>readonly<\/code> equivale a dichiarare ogni propriet\u00e0 della classe come <code>readonly<\/code>.<\/p>\n<p>Per esempio, con PHP 8.1 dovevate scrivere questo noioso codice per dichiarare tutte le propriet\u00e0 della classe come <code>readonly<\/code>:<\/p>\n<pre><code class=\"language-php\">class MyClass\n{\npublic readonly string $myValue,\npublic readonly int $myOtherValue\npublic readonly string $myAnotherValue\npublic readonly int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Immaginate la stessa cosa con molte altre propriet\u00e0. Ora, con PHP 8.2, potete scrivere semplicemente questo:<\/p>\n<pre><code class=\"language-php\">readonly class MyClass\n{\npublic string $myValue,\npublic int $myOtherValue\npublic string $myAnotherValue\npublic int $myYetAnotherValue\n}<\/code><\/pre>\n<p>Potete anche dichiarare classi astratte o finali come <code>readonly<\/code>. In questo caso, l&#8217;ordine delle parole chiave non ha importanza.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Potete anche dichiarare una classe <code>readonly<\/code> senza propriet\u00e0. In questo modo si evitano le propriet\u00e0 dinamiche e si permette alle classi figlie di dichiarare esplicitamente le loro propriet\u00e0 <code>readonly<\/code>.<\/p>\n<p>Inoltre, le classi <code>readonly<\/code> possono contenere solo propriet\u00e0 tipizzate: la stessa regola per la dichiarazione delle propriet\u00e0 individuali <strong>di sola lettura<\/strong>.<\/p>\n<p>Potete usare la propriet\u00e0 <code>mixed<\/code> type se non potete dichiarare una propriet\u00e0 strettamente tipizzata.<\/p>\n<p>Se provate a dichiarare una classe <code>readonly<\/code> senza una propriet\u00e0 tipizzata, otterrete un errore irreversibile:<\/p>\n<pre><code class=\"language-php\">readonly class Type {\n    public $nope;\n}\nFatal error: Readonly property Type::$nope must have type in ... on line ... <\/code><\/pre>\n<p>Inoltre, non potete dichiarare <code>readonly<\/code> per alcune funzioni di PHP:<\/p>\n<ul>\n<li><strong>Enums<\/strong> (perch\u00e9 <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#enums\">non possono contenere alcuna propriet\u00e0<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Interfaces<\/strong><\/li>\n<\/ul>\n<p>Il tentativo di dichiarare una di queste funzioni come <code>readonly<\/code> provocher\u00e0 un errore di parsing.<\/p>\n<pre><code class=\"language-php\">readonly interface Destiny {}\nParse error: syntax error, unexpected token \"interface\", expecting \"abstract\" or \"final\" or \"readonly\" or \"class\" in ... on line ...<\/code><\/pre>\n<p>Come per tutte le parole chiave di PHP, la parola chiave <code>readonly<\/code> non fa distinzione tra maiuscole e minuscole.<\/p>\n<p>PHP 8.2 depreca anche le propriet\u00e0 dinamiche (ne parleremo pi\u00f9 avanti). Tuttavia, non \u00e8 possibile impedire l&#8217;aggiunta di propriet\u00e0 dinamiche a una classe. Tuttavia, se lo fate per una classe <code>readonly<\/code> otterrete un errore irreversibile.<\/p>\n<pre><code class=\"language-php\">Fatal error: Readonly property Test::$test must have type in ... on line ...<\/code><\/pre>\n<h3>Consentire <code>true<\/code>, <code>false<\/code> e <code>null<\/code> come Tipi Indipendenti<\/h3>\n<p>PHP include gi\u00e0 tipi scalari come <code>int<\/code>, <code>string<\/code> e <code>bool<\/code>. Questo \u00e8 stato ampliato in PHP 8.0 con l&#8217;aggiunta dei <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/#union-types-2-0\">tipi union<\/a>, che permettono ai valori di essere di tipi diversi. La stessa RFC consentiva anche l&#8217;uso di <code>false<\/code> e <code>null<\/code> come parte di un tipo di unione, ma non erano ammessi come tipi a s\u00e9 stanti.<\/p>\n<p>Se si provava a dichiarare <code>false<\/code> o <code>null<\/code> come tipi indipendenti, senza che facessero parte di un tipo di unione, si otteneva un errore irreversibile.<\/p>\n<pre><code class=\"language-php\">function spam(): null {}\nfunction eggs(): false {}\n\nFatal error: Null can not be used as a standalone type in ... on line ...\nFatal error: False can not be used as a standalone type in ... on line ...<\/code><\/pre>\n<p>Per evitare questo scenario, PHP 8.2 supporta l&#8217;uso di <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> e <code>null<\/code><\/a> come tipi autonomi. Con questa aggiunta, il sistema di tipi di PHP \u00e8 pi\u00f9 espressivo e completo. Ora potete dichiarare con precisione i tipi di ritorno, di parametro e di propriet\u00e0.<\/p>\n<p>Inoltre, PHP non include ancora il tipo <code>true<\/code>, che sembra essere la naturale controparte del tipo <code>false<\/code>. PHP 8.2 risolve questo problema e <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">aggiunge il supporto per il tipo <code>true<\/code><\/a> . Non consente la coercizione, esattamente come il tipo <code>false<\/code>.<\/p>\n<p>Entrambi i tipi <code>true<\/code> e <code>false<\/code> sono essenzialmente un tipo unione del tipo <code>bool<\/code> di PHP. Per evitare la ridondanza, non potete dichiarare questi tre tipi insieme in un tipo union. In caso contrario, si verificher\u00e0 un errore irreversibile in fase di compilazione.<\/p>\n<h3>Tipi di Disjunctive Normal Form (DNF)<\/h3>\n<p>La <a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">Disjunctive Normal Form (DNF)<\/a> \u00e8 un modo standardizzato di organizzare le espressioni booleane. Consiste in una disgiunzione di congiunzioni &#8211; in termini booleani, si tratta di un <strong>OR di AND<\/strong>.<\/p>\n<p>L&#8217;applicazione del DNF alle dichiarazioni di tipo consente di scrivere <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#pure-intersection-types\">tipi combinati di Union e Intersection<\/a> che il parser pu\u00f2 gestire. La <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">nuova funzione dei tipi DNF<\/a> di PHP 8.2 \u00e8 semplice ma potente se usata correttamente.<\/p>\n<p>La RFC fornisce il seguente esempio. Presuppone che esistano gi\u00e0 le seguenti definizioni di interfacce e classi:<\/p>\n<pre><code class=\"language-php\">interface A {}\ninterface B {}\ninterface C extends A {}\ninterface D {}\n\nclass W implements A {}\nclass X implements B {}\nclass Y implements A, B {}\nclass Z extends Y implements C {}<\/code><\/pre>\n<p>Con i tipi DNF, potete eseguire dichiarazioni di tipo per propriet\u00e0, parametri e valori di ritorno in questo modo:<\/p>\n<pre><code class=\"language-php\">\/\/ Accepts an object that implements both A and B,\n\/\/ OR an object that implements D\n(A&B)|D\n\n\/\/ Accepts an object that implements C,\n\/\/ OR a child of X that also implements D,\n\/\/ OR null\nC|(X&D)|null\n\n\/\/ Accepts an object that implements all three of A, B, and D,\n\/\/ OR an int,\n\/\/ OR null.\n(A&B&D)|int|null<\/code><\/pre>\n<p>In alcuni casi, le propriet\u00e0 potrebbero non essere in forma DNF. Dichiarandole come tali si otterr\u00e0 un errore di parsing. Ma potete sempre riscriverle come:<\/p>\n<pre><code class=\"language-php\">A&(B|D)\n\/\/ Can be rewritten as (A&B)|(A&D)\n\nA|(B&(D|W)|null)\n\/\/ Can be rewritten as A|(B&D)|(B&W)|null<\/code><\/pre>\n<p>Dovete notare che ogni segmento di un tipo DNF deve essere unico. Per esempio, dichiarare <code>(A&B)|(B&A)<\/code> non \u00e8 valido perch\u00e9 i due segmenti <strong>OR<\/strong> sono logicamente uguali.<\/p>\n<p>Inoltre, non sono ammessi nemmeno i segmenti che sono sottoinsiemi rigorosi di un altro segmento. Questo perch\u00e9 il sottoinsieme avr\u00e0 gi\u00e0 tutte le istanze del sottoinsieme, rendendo superfluo l&#8217;uso del DNF.<\/p>\n<h3>Ridurre i Parametri Sensibili nei Back-Trace<\/h3>\n<p>Come quasi tutti i <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">linguaggi di programmazione<\/a>, <a href=\"https:\/\/kinsta.com\/php\/\">PHP<\/a> permette di tracciare lo stack delle chiamate in qualsiasi punto dell&#8217;esecuzione del codice. Il tracciamento dello stack facilita il debug del codice per correggere gli errori e i colli di bottiglia delle prestazioni. Costituisce la spina dorsale di strumenti come <a href=\"https:\/\/kinsta.com\/it\/strumento-apm\/\">Kinsta APM<\/a>, il nostro <a href=\"https:\/\/kinsta.com\/it\/blog\/monitoraggio-prestazioni-applicazioni\/\">strumento di monitoraggio delle prestazioni<\/a> progettato su misura per i siti WordPress.<\/p>\n<figure id=\"attachment_59170\" aria-describedby=\"caption-attachment-59170\" style=\"width: 1107px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-59170 size-full\" src=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/mykinsta-php-admin-it.png\" alt=\"Tracciamento delle transazioni lente di WooCommerce con Kinsta APM.\" width=\"1107\" height=\"659\" srcset=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/mykinsta-php-admin-it.png 1107w, https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/mykinsta-php-admin-it-300x179.png 300w, https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/mykinsta-php-admin-it-1024x610.png 1024w, https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/mykinsta-php-admin-it-768x457.png 768w\" sizes=\"auto, (max-width: 1107px) 100vw, 1107px\" \/><figcaption id=\"caption-attachment-59170\" class=\"wp-caption-text\">Tracciamento delle transazioni lente di WooCommerce con Kinsta APM.<\/figcaption><\/figure>\n<p>L&#8217;esecuzione di una traccia dello stack non interrompe l&#8217;esecuzione del programma. In genere, la maggior parte delle tracce di stack vengono eseguite in background e registrate in modo silenzioso per poter essere controllate in seguito, se necessario.<\/p>\n<p>Tuttavia, alcune di queste dettagliate tracce di stack di PHP possono rappresentare un inconveniente se vengono condivise con servizi di terze parti, solitamente per l&#8217;<a href=\"https:\/\/kinsta.com\/it\/blog\/log-errori-wordpress\/\">analisi dei log degli errori<\/a>, il tracciamento degli errori, ecc. Queste tracce di stack possono includere informazioni sensibili come nomi utente, password e variabili d&#8217;ambiente.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">Questa proposta RFC<\/a> ne fornisce un esempio:<\/p>\n<blockquote><p>Un &#8220;colpevole&#8221; comune \u00e8 PDO che prende la password del database come parametro del costruttore e tenta immediatamente di connettersi al database all&#8217;interno del costruttore, invece di avere un costruttore puro e un metodo <strong>-&gt;connect() separato<\/strong>. In questo modo, quando la connessione al database fallisce, la traccia dello stack include la password del database:<\/p>\n<pre><code class=\"language-php\">PDOException: SQLSTATE[HY000] [2002] No such file or directory in \/var\/www\/html\/test.php:3\nStack trace: #0 \/var\/www\/html\/test.php(3): PDO-&gt;__construct('mysql:host=loca...', 'root', 'password')\n#1 {main}<\/code><\/pre>\n<\/blockquote>\n<p>PHP 8.2 consente di <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">contrassegnare tali parametri sensibili<\/a> con il nuovo attributo <code>\\SensitiveParameter<\/code>. Qualsiasi parametro contrassegnato come sensibile non verr\u00e0 elencato nelle backtrace. In questo modo, potrete condividerli senza problemi con servizi di terze parti.<\/p>\n<p>Ecco un esempio semplice con un singolo parametro sensibile:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nfunction example(\n    $ham,\n    #[\\SensitiveParameter] $eggs,\n    $butter\n) {\n    throw new \\Exception('Error');\n}\n\nexample('ham', 'eggs', 'butter');\n\n\/*\nFatal error: Uncaught Exception: Error in test.php:8\nStack trace:\n#0 test.php(11): test('ham', Object(SensitiveParameterValue), 'butter')\n#1 {main}\nthrown in test.php on line 8\n*\/<\/code><\/pre>\n<p>Quando generate un backtrace, qualsiasi parametro con l&#8217;attributo <code>\\SensitiveParameter<\/code> verr\u00e0 sostituito con un oggetto <code>\\SensitiveParameterValue<\/code> e il suo valore reale non verr\u00e0 mai memorizzato nel trace. L&#8217;oggetto <code>SensitiveParameterValue<\/code> incapsula il valore reale del parametro, se ne avete bisogno per qualsiasi motivo.<\/p>\n<h3>Nuova Funzione <code>mysqli_execute_query<\/code> e Metodo <code>mysqli::execute_query<\/code><\/h3>\n<p>Avete mai usato la funzione <code>mysqli_query()<\/code> con valori utente pericolosamente sfuggenti solo per eseguire una query MySQLi parametrizzata?<\/p>\n<p>PHP 8.2 rende <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">pi\u00f9 semplice l&#8217;esecuzione di query MySQLi parametrizzate<\/a> grazie alla nuova funzione <code>mysqli_execute_query($sql, $params)<\/code> e al metodo <code>mysqli::execute_query<\/code>.<\/p>\n<p>Essenzialmente, questa nuova funzione \u00e8 una combinazione delle funzioni <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code> e <code>mysqli_stmt_get_result()<\/code>. Con questa funzione, la query MySQLi viene preparata, vincolata (se si passano dei parametri) ed eseguita all&#8217;interno della funzione stessa. Se la query viene eseguita correttamente, restituir\u00e0 un oggetto <code>mysqli_result<\/code>. Se non ha successo, restituir\u00e0 <code>false<\/code>.<\/p>\n<p>La proposta RFC fornisce un esempio semplice ma efficace:<\/p>\n<pre><code class=\"\"language-php\">foreach ($db-&gt;execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) {\nprint_r($row);\n}<\/code><\/pre>\n<h3>Recuperare le Propriet\u00e0 di <code>enum<\/code> nelle Espressioni di <code>const<\/code><\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">Questa RFC propone di<\/a> consentire all&#8217;operatore <code>-&gt;\/?-&gt;<\/code> di recuperare le propriet\u00e0 <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a> nelle espressioni di <code>const<\/code>.<\/p>\n<p>Il motivo principale di questa nuova funzionalit\u00e0 \u00e8 che non \u00e8 possibile usare gli oggetti di <code>enum<\/code> in alcuni punti, come le chiavi degli array. In questo caso, dovrete ripetere il valore del caso <code>enum<\/code> solo per poterlo utilizzare.<\/p>\n<p>Permettere il recupero delle propriet\u00e0 di <code>enum<\/code> nei punti in cui gli oggetti di <code>enum<\/code> non sono consentiti pu\u00f2 semplificare questa procedura.<\/p>\n<p>Ci\u00f2 significa che il codice seguente \u00e8 ora valido:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>E per sicurezza, questa RFC include anche il supporto per l&#8217;operatore nullsafe <code>?-&gt;<\/code>.<\/p>\n<h3>Consentire le Costanti nei Traits<\/h3>\n<p>PHP include un modo per riutilizzare il codice chiamato Traits. Sono ottimi per il riutilizzo del codice tra le varie classi.<\/p>\n<p>Attualmente, i Traits permettono di definire solo metodi e propriet\u00e0, ma non le costanti. Ci\u00f2 significa che non potete definire gli invarianti previsti da un Traits all&#8217;interno del Traits stesso. Per aggirare questa limitazione, dovete definire le costanti nella classe che lo compone o in un&#8217;interfaccia implementata dalla classe che lo compone.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">Questa RFC propone<\/a> di consentire la definizione di costanti nei Traits. Queste costanti possono essere definite proprio come le costanti di una classe. Questo esempio tratto direttamente dalla RFC chiarisce il suo utilizzo:<\/p>\n<pre><code class=\"language-php\">trait Foo {\n    public const FLAG_1 = 1;\n    protected const FLAG_2 = 2;\n    private const FLAG_3 = 2;\n\n    public function doFoo(int $flags): void {\n        if ($flags & self::FLAG_1) {\n            echo 'Got flag 1';\n        }\n        if ($flags & self::FLAG_2) {\n            echo 'Got flag 2';\n        }\n        if ($flags & self::FLAG_3) {\n        echo 'Got flag 3';\n        }\n    }\n}<\/code><\/pre>\n<p>Anche le costanti dei Traits sono incorporate nella definizione della classe che li compone, come le definizioni delle propriet\u00e0 e dei metodi di un Traits. Inoltre hanno restrizioni simili a quelle delle propriet\u00e0 dei Traits. Come indicato nell&#8217;RFC, questa proposta &#8211; sebbene sia un buon inizio &#8211; necessita di ulteriore lavoro per perfezionare la funzione.<\/p>\n<h2>Deprecazioni in PHP 8.2<\/h2>\n<p>Possiamo ora passare a esplorare tutte le deprecazioni di PHP 8.2. L&#8217;elenco non \u00e8 cos\u00ec ampio come le nuove funzionalit\u00e0:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Propriet\u00e0 Dinamiche Deprecate (e Nuovo Attributo <code>#[AllowDynamicProperties]<\/code> )<\/h3>\n<p>Fino a PHP 8.1, era possibile <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-javascript\/#typing-of-variables\">impostare e recuperare dinamicamente propriet\u00e0 di classe non dichiarate<\/a> in PHP. Per esempio:<\/p>\n<pre><code class=\"language-php\">class Post {\n    private int $pid;\n}\n\n$post = new Post();\n$post-&gt;name = 'Kinsta';<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Qui la classe <code>Post<\/code> non dichiara una propriet\u00e0 <code>name<\/code>. Ma dato che PHP consente le propriet\u00e0 dinamiche, potete impostarla al di fuori della dichiarazione della classe. Questo \u00e8 il suo pi\u00f9 grande &#8211; e forse l&#8217;unico &#8211; vantaggio.<\/p>\n<p>Le propriet\u00e0 dinamiche permettono di creare bug e comportamenti inaspettati nel vostro codice. Per esempio, se commettete un errore nel dichiarare una propriet\u00e0 della classe al di fuori di essa, \u00e8 facile perderne traccia, soprattutto durante il debug di eventuali errori all&#8217;interno della classe stessa.<\/p>\n<p>A partire da PHP 8.2, le <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">propriet\u00e0 dinamiche sono deprecate<\/a>. L&#8217;impostazione di un valore a una propriet\u00e0 di classe non dichiarata emetter\u00e0 un avviso di deprecazione la prima volta che la propriet\u00e0 verr\u00e0 impostata.<\/p>\n<pre><code class=\"language-php\">class Foo {}\n$foo = new Foo;\n\n\/\/ Deprecated: Creation of dynamic property Foo::$bar is deprecated\n$foo-&gt;bar = 1;\n\n\/\/ No deprecation warning: Dynamic property already exists.\n$foo-&gt;bar = 2;<code class=\"language-php\"><\/code><\/code><\/pre>\n<p>Tuttavia, a partire da PHP 9.0, l&#8217;impostazione di una propriet\u00e0 dinamica emette un errore <code>ErrorException<\/code>.<\/p>\n<p>Se il vostro codice \u00e8 pieno di propriet\u00e0 dinamiche &#8211; e molto codice PHP lo \u00e8 &#8211; e se volete evitare questi avvisi di deprecazione dopo l&#8217;aggiornamento a PHP 8.2, potete usare il nuovo attributo <code>#[AllowDynamicProperties]<\/code> di PHP 8.2 per consentire le propriet\u00e0 dinamiche sulle classi.<\/p>\n<pre><code class=\"language-php\">#[AllowDynamicProperties]\nclass Pets {}\nclass Cats extends Pets {}\n\n\/\/ You'll get no deprecation warning\n$obj = new Pets;\n$obj-&gt;test = 1;\n\n\/\/ You'll get no deprecation warning for child classes\n$obj = new Cats;\n$obj-&gt;test = 1;<\/code><\/pre>\n<p>Secondo l&#8217;RFC, le classi contrassegnate come <code>#[AllowDynamicProperties]<\/code>, cos\u00ec come le loro classi figlie, possono continuare a usare le propriet\u00e0 dinamiche senza essere deprecate o rimosse.<\/p>\n<p>Considerate inoltre che, in PHP 8.2, l&#8217;unica classe in bundle contrassegnata come <code>#[AllowDynamicProperties]<\/code> \u00e8 <code>stdClass<\/code>. Inoltre, le propriet\u00e0 a cui si accede tramite i <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\"> magic methods PHP<\/a> <code>__get()<\/code> o <code>__set()<\/code> non sono considerate propriet\u00e0 dinamiche e quindi non riceveranno un avviso di deprecazione.<\/p>\n<h3>Deprecate i Callables Parzialmente Supportati<\/h3>\n<p>Un&#8217;altra modifica di PHP 8.2, anche se con un impatto pi\u00f9 trascurabile, \u00e8 la <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">deprecazione dei callables parzialmente supportati<\/a>.<\/p>\n<p>Queste callables sono definite parzialmente supportate perch\u00e9 non \u00e8 possibile interagire con esse direttamente tramite <code>$callable()<\/code>. Potete raggiungerle solo con la funzione <code>call_user_func($callable)<\/code>. L&#8217;elenco di tali callables non \u00e8 lungo:<\/p>\n<pre><code class=\"language-php\">\"self::method\"\n\"parent::method\"\n\"static::method\"\n[\"self\", \"method\"]\n[\"parent\", \"method\"]\n[\"static\", \"method\"]\n[\"Foo\", \"Bar::method\"]\n[new Foo, \"Bar::method\"]<\/code><\/pre>\n<p>A partire da PHP 8.2, qualsiasi tentativo di invocare tali callables &#8211; come per esempio tramite le funzioni <code>call_user_func()<\/code> o <code>array_map()<\/code> &#8211; produrr\u00e0 un avviso di deprecazione.<\/p>\n<p>La RFC originale fornisce una solida motivazione alla base di questa deprecazione:<\/p>\n<blockquote><p><em>A parte gli ultimi due casi, tutti questi callables dipendono dal contesto. Il metodo a cui <code>\"self::method\"<\/code> fa riferimento dipende dalla classe da cui viene effettuata la chiamata o la verifica della callability. In pratica, questo vale anche per gli ultimi due casi, se utilizzati nella forma di <code>[new Foo, \"parent::method\"]<\/code>.<\/em><\/p>\n<p><em>Ridurre la dipendenza dal contesto delle callable \u00e8 l&#8217;obiettivo secondario di questa RFC. Dopo questa RFC, l&#8217;unica dipendenza dal contesto rimasta \u00e8 la visibilit\u00e0 dei metodi: <code>\"Foo::bar\"<\/code> pu\u00f2 essere visibile in un ambito, ma non in un altro. Se in futuro le callable dovessero essere limitate ai metodi pubblici (mentre i metodi privati dovrebbero utilizzare callable di prima classe o <code>Closure::fromCallable()<\/code> per essere resi indipendenti dall&#8217;ambito), il tipo di callable diventerebbe ben definito e potrebbe essere utilizzato come tipo di propriet\u00e0.<\/em><em>Tuttavia, le modifiche alla gestione della visibilit\u00e0 non sono proposte nell&#8217;ambito di questa RFC<\/em><\/p><\/blockquote>\n<p>Come previsto dalla RFC originale, la funzione <code>is_callable()<\/code> e il tipo <code>callable<\/code> continueranno ad accettare queste callable come eccezioni. Ma solo fino a quando il loro supporto non sar\u00e0 rimosso completamente a partire da PHP 9.0.<\/p>\n<p>Per evitare confusione, l&#8217;ambito di questo avviso di deprecazione \u00e8 stato <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">ampliato con una nuova RFC<\/a> che ora include anche queste eccezioni.<\/p>\n<p>\u00c8 bello vedere come PHP si stia muovendo per avere un tipo <code>callable<\/code> ben definito.<\/p>\n<h3>Deprecate le Funzioni <code>#utf8_encode()<\/code> e <code>utf8_decode()<\/code><\/h3>\n<p>Le funzioni incorporate di PHP <code>utf8_encode()<\/code> e <code>utf8_decode()<\/code> convertono le stringhe codificate in ISO-8859-1 (&#8220;Latin 1&#8221;) da e verso UTF-8.<\/p>\n<p>Tuttavia, i loro nomi suggeriscono un uso pi\u00f9 generale di quello consentito dalla loro implementazione. La codifica &#8220;Latin 1&#8221; viene comunemente confusa con altre codifiche come la &#8220;Windows Code Page 1252&#8221;<\/p>\n<p>Inoltre, di solito viene visualizzato <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a> quando queste funzioni non riescono a convertire correttamente una stringa. La mancanza di messaggi di errore rende difficile individuarli, soprattutto in un mare di testo altrimenti leggibile.<\/p>\n<p>PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">ha deprecato le funzioni <code>#utf8_encode()<\/code> e <code>utf8_decode()<\/code><\/a> . Se le invocate, vedrete questi avvisi di deprecazione:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>La RFC suggerisce di usare <a href=\"https:\/\/kinsta.com\/it\/blog\/installare-php\/#all-about-php-extensions\">le estensioni supportate da PHP<\/a> come <code>mbstring<\/code>, <code>iconv<\/code> e <code>intl<\/code>.<\/p>\n<h3>Deprecata l&#8217;Interpolazione di Stringhe di <code>${}<\/code><\/h3>\n<p>PHP permette di incorporare variabili nelle stringhe con doppi apici (<code>\"<\/code>) e heredoc (<code>&lt;&lt;&lt;<\/code>) in diversi modi:<\/p>\n<ol>\n<li>Incorporare direttamente le variabili <code>\u201c$foo\u201d<\/code><\/li>\n<li>Con parentesi graffe all&#8217;esterno della variabile &#8211; <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Con le parentesi graffe dopo il segno del dollaro <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Variabili &#8211; <code>\u201c${expr}\u201d<\/code> &#8211; equivalente all&#8217;uso di <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>I primi due modi hanno i loro pro e contro, mentre gli ultimi due hanno una sintassi complessa e contrastante. PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">depreca le ultime due modalit\u00e0 di interpolazione delle stringhe<\/a>.<\/p>\n<p>In futuro dovreste evitare di interpolare le stringhe in questo modo:<\/p>\n<pre><code class=\"language-php\">\"Hello, ${world}!\";\nDeprecated: Using ${} in strings is deprecated\n\n\"Hello, ${(world)}!\";\nDeprecated: Using ${} (variable variables) in strings is deprecated<\/code><\/pre>\n<p>A partire da PHP 9.0, queste deprecazioni saranno aggiornate per lanciare un&#8217;eccezione di errore.<\/p>\n<h3>Deprecate le Funzioni mbstring per le Entit\u00e0 Base64\/QPrint\/Uuencode\/HTML<\/h3>\n<p>Le funzioni mbstring (multi-byte string) di PHP ci aiutano a lavorare con Unicode, entit\u00e0 HTML e altre codifiche di testo precedenti.<\/p>\n<p>Tuttavia, Base64, Uuencode e QPrint non sono codifiche di testo e fanno comunque parte di queste funzioni, principalmente per motivi di legacy. PHP include anche implementazioni separate di queste codifiche.<\/p>\n<p>Per quanto riguarda le entit\u00e0 HTML, PHP dispone di funzioni integrate &#8211; <code>htmlspecialchars()<\/code> e <code>htmlentities()<\/code> &#8211; per gestirle meglio. Per esempio, a differenza di mbstring, queste funzioni convertono anche i caratteri <code>&lt;<\/code>. <code>&gt;<\/code>, e <code>&<\/code> in entit\u00e0 HTML.<\/p>\n<p>Inoltre, PHP migliora continuamente le sue funzioni integrate, <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">come nel caso di PHP 8.1 con le funzioni di codifica e decodifica HTML<\/a>.<\/p>\n<p>Quindi, tenendo presente tutto ci\u00f2, PHP 8.2 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">depreca l&#8217;uso di mbstring per queste codifiche<\/a> (le etichette non fanno distinzione tra maiuscole e minuscole):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (alias di HTML-ENTITIES)<\/li>\n<li>Quoted-Printable<\/li>\n<li>qprint (alias di Quoted-Printable)<\/li>\n<\/ul>\n<p>A partire da PHP 8.2, l&#8217;utilizzo di mbstring per la codifica\/decodifica di uno qualsiasi dei suddetti elementi emetter\u00e0 un avviso di deprecazione. PHP 9.0 rimuover\u00e0 completamente il supporto di mbstring per queste codifiche.<\/p>\n<h2>Altri Cambiamenti Minori in PHP 8.2<\/h2>\n<p>Infine, possiamo parlare dei cambiamenti minori di PHP 8.2, tra cui le caratteristiche e le funzionalit\u00e0 rimosse.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Rimosso il Supporto per libmysql da mysqli<\/h3>\n<p>Attualmente, PHP permette ai driver <code>mysqli<\/code> e <code>PDO_mysql<\/code> di compilare le librerie <code>mysqlnd<\/code> e <code>libmysql<\/code>. Tuttavia, il driver predefinito e consigliato da PHP 5.4 \u00e8 <code>mysqlnd<\/code>.<\/p>\n<p>Entrambi i driver hanno molti vantaggi e svantaggi. Tuttavia, la rimozione del supporto per uno di essi &#8211; idealmente, la <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\">rimozione di <code>libmysql<\/code><\/a> in quanto non \u00e8 quello predefinito &#8211; semplificher\u00e0 il codice e i test unitari di PHP.<\/p>\n<p>Per argomentare questo favore, la RFC elenca molti vantaggi di <code>mysqlnd<\/code>:<\/p>\n<ul>\n<li>Viene fornito in bundle con PHP<\/li>\n<li>Usa la gestione della memoria di PHP per monitorare l&#8217;utilizzo della memoria e<br \/>\n<a href=\"https:\/\/kinsta.com\/it\/blog\/prestazioni-laravel\/\">migliorare le prestazioni<\/a><\/li>\n<li>Fornisce funzioni di qualit\u00e0 della vita (per esempio <code>get_result()<\/code>)<\/li>\n<li>Restituisce valori numerici utilizzando i tipi nativi di PHP<\/li>\n<li>La sua funzionalit\u00e0 non dipende dalla libreria esterna<\/li>\n<li>Funzionalit\u00e0 plugin opzionale<\/li>\n<li>Supporta le query asincrone<\/li>\n<\/ul>\n<p>La RFC elenca anche alcuni vantaggi di <code>libmysql<\/code>, tra cui:<\/p>\n<ul>\n<li>Possibilit\u00e0 di auto-riconnessione ( <code>mysqlnd<\/code> non supporta intenzionalmente questa funzionalit\u00e0 perch\u00e9 pu\u00f2 essere facilmente sfruttata)<\/li>\n<li>Modalit\u00e0 di autenticazione LDAP e SASL (<code>mysqlnd<\/code> <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">potrebbe aggiungere<\/a> presto anche <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">questa funzionalit\u00e0<\/a> )<\/li>\n<\/ul>\n<p>Inoltre, la RFC elenca molti svantaggi di <code>libmysql<\/code>: incompatibilit\u00e0 con il modello di memoria di PHP, molti test falliti, perdite di memoria, funzionalit\u00e0 diverse tra le varie versioni, ecc.<\/p>\n<p>Tenendo presente tutto questo, PHP 8.2 ha rimosso il supporto per la creazione di <code>mysqli<\/code> contro <code>libmysql<\/code>.<\/p>\n<p>Se volete aggiungere una funzionalit\u00e0 che \u00e8 disponibile solo con <code>libmysql<\/code>, dovrete aggiungerla esplicitamente a<code> mysqlnd<\/code> come richiesta di funzionalit\u00e0. Inoltre, non potete aggiungere la connessione automatica.<\/p>\n<h3>Conversione di Casi Indipendente dalla Lingua Locale<\/h3>\n<p>Prima di <a href=\"https:\/\/kinsta.com\/it\/blog\/php-8\/\">PHP 8.0<\/a>, il locale di PHP veniva ereditato dall&#8217;ambiente di sistema. Ma questo poteva causare un problema in alcuni casi limite.<\/p>\n<p>L&#8217;impostazione della lingua durante l&#8217;installazione di Linux imposta la lingua dell&#8217;interfaccia utente appropriata per i <a href=\"https:\/\/kinsta.com\/it\/blog\/comandi-linux\/\">comandi integrati<\/a>. Tuttavia, cambia inaspettatamente anche il funzionamento della libreria C per la gestione delle stringhe.<\/p>\n<p>Per esempio, se durante l&#8217;installazione di Linux avete selezionato la lingua &#8220;turca&#8221; o &#8220;kazaka&#8221;, vedrete che chiamando <code>toupper('i')<\/code> per ottenere l&#8217;equivalente maiuscolo otterrete la <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">I maiuscola tratteggiata<\/a> (U+0130, <code>\u0130<\/code>).<\/p>\n<p>PHP 8.0 ha eliminato questa anomalia impostando il locale predefinito su &#8220;C&#8221;, a meno che l&#8217;utente non lo cambi esplicitamente tramite <code>setlocale()<\/code>.<\/p>\n<p>PHP 8.2 si spinge oltre, <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">eliminando la sensibilit\u00e0 del locale dalle conversioni di maiuscole e minuscole<\/a>. Questa RFC modifica principalmente le funzioni <code>strtolower()<\/code>, <code>strtoupper()<\/code> e le funzioni correlate. Leggete l&#8217;RFC per un elenco di tutte le funzioni interessate.<\/p>\n<p>In alternativa, se volete usare la conversione di maiuscole e minuscole localizzata, potete usare <code>mb_strtolower()<\/code>.<\/p>\n<h3>Miglioramento dell&#8217;Estensione Casuale<\/h3>\n<p>PHP sta pianificando una <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">revisione della sua funzionalit\u00e0 random<\/a>.<\/p>\n<p>Al momento, la funzionalit\u00e0 casuale di PHP si basa molto sullo <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">stato di Mersenne Twister<\/a>. Tuttavia, questo stato \u00e8 implicitamente memorizzato nell&#8217;area globale di PHP: non c&#8217;\u00e8 modo per un utente di accedervi. L&#8217;aggiunta di funzioni di randomizzazione tra la fase iniziale di seeding e l&#8217;uso previsto comporterebbe la rottura del codice.<\/p>\n<p>La manutenzione di questo codice pu\u00f2 essere ancora pi\u00f9 complicata se il vostro codice usa pacchetti esterni.<\/p>\n<p>Pertanto, l&#8217;attuale funzionalit\u00e0 di randomizzazione di PHP non \u00e8 in grado di riprodurre valori casuali in modo coerente. Fallisce persino i test statistici empirici sui generatori di numeri casuali uniformi, come <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">Crush e BigCrush di TestU01<\/a>. La limitazione a 32 bit di Mersenne Twister aggrava ulteriormente la situazione.<\/p>\n<p>Pertanto, l&#8217;utilizzo delle funzioni integrate di PHP &#8211; <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> &#8211; non \u00e8 consigliato se avete bisogno di numeri casuali crittograficamente sicuri. In questi casi, dovrete implementare una nuova funzione utilizzando <code>random_int()<\/code> o funzioni simili.<\/p>\n<p>Tuttavia, dopo l&#8217;inizio delle votazioni sono stati sollevati <a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">diversi problemi con questa RFC<\/a>. Questa battuta d&#8217;arresto ha costretto il team di PHP ad annotare tutti i problemi in un RFC separato, con un&#8217;opzione di voto creata per ogni problema. Decideranno di procedere solo dopo aver raggiunto un consenso.<\/p>\n<h2>Altre RFC in PHP 8.2<\/h2>\n<p>PHP 8.2 include anche molte nuove funzioni e modifiche minori. Le citiamo di seguito con i link alle risorse aggiuntive:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Nuova funzione <code>curl_upkeep<\/code><\/a>: PHP 8.2 aggiunge questa nuova funzione alla sua estensione Curl. Richiama la funzione <code>curl_easy_upkeep()<\/code> in libcurl, la libreria C sottostante che l&#8217;estensione Curl di PHP utilizza.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Nuova funzione <code>ini_parse_quantity<\/code><\/a>: Le direttive INI di PHP accettano dimensioni di dati con un suffisso moltiplicatore. Per esempio, potete scrivere 25 Megabyte come <code>25M<\/code>, o 42 Gigabyte come <code>42G<\/code>. Questi suffissi sono comuni nei file INI di PHP ma sono poco diffusi altrove. Questa nuova funzione analizza i <a href=\"https:\/\/kinsta.com\/it\/blog\/aumentare-dimensione-massima-caricamento-wordpress\/#create-or-modify-the-phpini-file\">valori INI di PHP<\/a> e restituisce la loro dimensione in byte.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Nuova funzione <code>memory_reset_peak_usage<\/code><\/a>: Questa funzione reimposta il picco di utilizzo della memoria restituito dalla funzione <code>memory_get_peak_usage<\/code>. Pu\u00f2 essere utile quando eseguite la stessa azione pi\u00f9 volte e volete registrare il picco di utilizzo della memoria di ogni esecuzione.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">Supporto per il modifer no-capture (<code>\/n<\/code>) nelle funzioni di <code>preg_*<\/code>:<\/a> Nelle regex, il metacarattere <code>()<\/code> indica un gruppo di cattura. Ci\u00f2 significa che vengono restituite tutte le corrispondenze dell&#8217;espressione all&#8217;interno della parentesi. PHP 8.2 aggiunge un modifer no-capture (<code>\/n<\/code>) per impedire questo comportamento.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\">La famiglia <code>iterator_*()<\/code> accetta tutti gli iterabili<\/a>: Al momento, la famiglia <code>iterator_*()<\/code> di PHP accetta solo <code>\\Traversables<\/code> (cio\u00e8 non sono ammessi array semplici). Si tratta di una limitazione non necessaria e questa RFC la risolve.<\/li>\n<\/ol>\n<h2>Riepilogo<\/h2>\n<p>PHP 8.2 si basa sugli enormi miglioramenti apportati da PHP 8.0 e PHP 8.1, e non \u00e8 un&#8217;impresa facile. Le caratteristiche pi\u00f9 interessanti di PHP 8.2 sono i nuovi tipi standalone, le propriet\u00e0 readonly e i numerosi miglioramenti delle prestazioni.<\/p>\n<p>Non vediamo l&#8217;ora di <a href=\"https:\/\/kinsta.com\/it\/blog\/benchmark-php\/\">confrontare PHP 8.2<\/a> con diversi <a href=\"https:\/\/kinsta.com\/it\/blog\/framework-php\/\">framework<\/a> e <a href=\"https:\/\/kinsta.com\/it\/quota-di-mercato-di-wordpress\/\">CMS<\/a> <a href=\"https:\/\/kinsta.com\/it\/blog\/framework-php\/\">PHP<\/a>.<\/p>\n<p>Mettete tra i preferiti questo articolo per poterlo consultare in futuro.<\/p>\n<p><em>Quali sono le caratteristiche di PHP 8.2 che preferite? Quali sono le deprecazioni che vi piacciono di pi\u00f9? Condividete la vostra opzione con la comunit\u00e0 nella sezione commenti!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP 8.2 si fonda sulla base rinnovata da PHP 8.0 e PHP 8.1.\u00a0Ora che \u00e8 stato rilasciato PHP 8.2, analizziamo in dettaglio le novit\u00e0: dalle nuove &#8230;<\/p>\n","protected":false},"author":117,"featured_media":58934,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[],"class_list":["post-58933","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"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.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro<\/title>\n<meta name=\"description\" content=\"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.\" \/>\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-2\/\" \/>\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.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro\" \/>\n<meta property=\"og:description\" content=\"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\" \/>\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=\"2022-08-11T12:23:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-04T10:01:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.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=\"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.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=\"18 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-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro\",\"datePublished\":\"2022-08-11T12:23:08+00:00\",\"dateModified\":\"2023-01-04T10:01:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\"},\"wordCount\":3328,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\",\"name\":\"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png\",\"datePublished\":\"2022-08-11T12:23:08+00:00\",\"dateModified\":\"2023-01-04T10:01:39+00:00\",\"description\":\"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto 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.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro","description":"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.","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-2\/","og_locale":"it_IT","og_type":"article","og_title":"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro","og_description":"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.","og_url":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2022-08-11T12:23:08+00:00","article_modified_time":"2023-01-04T10:01:39+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Salman Ravoof","Tempo di lettura stimato":"18 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro","datePublished":"2022-08-11T12:23:08+00:00","dateModified":"2023-01-04T10:01:39+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/"},"wordCount":3328,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/","name":"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto Altro","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","datePublished":"2022-08-11T12:23:08+00:00","dateModified":"2023-01-04T10:01:39+00:00","description":"\u00c8 stato rilasciato PHP 8.2. Scopri le nuove funzionalit\u00e0, i miglioramenti, le deprecazioni e le modifiche minori introdotte con questa release.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/whats-new-in-php-82-5.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/php-8-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Le Novit\u00e0 di PHP 8.2: Funzionalit\u00e0 Nuove e Deprecate, Modifiche e Molto 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\/58933","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=58933"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/58933\/revisions"}],"predecessor-version":[{"id":63446,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/58933\/revisions\/63446"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/translations\/se"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/58933\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/58934"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=58933"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=58933"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=58933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}