{"id":52068,"date":"2022-08-11T09:23:11","date_gmt":"2022-08-11T12:23:11","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=52068&#038;preview=true&#038;preview_id=52068"},"modified":"2023-08-22T04:47:00","modified_gmt":"2023-08-22T07:47:00","slug":"php-8-2","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/","title":{"rendered":"O que H\u00e1 de Novo no PHP 8.2 &#8211; Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais"},"content":{"rendered":"<p>O PHP 8.2 se baseia nas novas bases do <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\">PHP 8.0<\/a> e do <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\">PHP 8.1<\/a>. Agora que o <a href=\"https:\/\/www.php.net\/releases\/8.2\/en.php\">PHP 8.2<\/a> foi lan\u00e7ado, vamos nos aprofundar no que h\u00e1 de novo no PHP 8.2. Analisaremos tudo, desde novos recursos e melhorias at\u00e9 deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es.<\/p>\n<p>Como o PHP 8.2 entrou em seu congelamento de recursos em 19 de julho de 2022, voc\u00ea n\u00e3o pode esperar adi\u00e7\u00f5es significativas a esta lista.<\/p>\n<p>Entusiasmado? Tamb\u00e9m estamos.<\/p>\n<p>Vamos come\u00e7ar!<\/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>Novas funcionalidades e melhorias no PHP 8.2<\/h2>\n<p>Vamos come\u00e7ar explorando todas as \u00faltimas funcionalidades do PHP 8.2. \u00c9 uma lista bastante extensa:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Novas clases <code>readonly<\/code><\/h3>\n<p>O PHP 8.1 introduziu o <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#new-readonly-properties\">recurso <code>readonly<\/code> para propriedades de classe<\/a>. Agora, o PHP 8.2 est\u00e1 adicionando suporte para <a href=\"https:\/\/wiki.php.net\/rfc\/readonly_classes\">declarar a classe inteira como <code>readonly<\/code>.<\/a><\/p>\n<p>Caso voc\u00ea declarar uma classe como <code>readonly<\/code>, todas as suas propriedades herdar\u00e3o automaticamente o recurso <code>readonly<\/code>. Assim, declarar uma classe como <code>readonly<\/code> \u00e9 o mesmo que declarar todas as propriedades de classe como <code>readonly<\/code>.<\/p>\n<p>Por exemplo, com o PHP 8.1, voc\u00ea teve que escrever este c\u00f3digo tedioso para declarar todas as propriedades da classe como <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>Imagine o mesmo com muito mais propriedades. Agora, com o PHP 8.2, voc\u00ea pode simplesmente escrever isto:<\/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>Voc\u00ea tamb\u00e9m pode declarar clases abstratas ou finais como <code>readonly<\/code>. Aqui, a ordem das palavras-chave n\u00e3o importa.<\/p>\n<pre><code class=\"language-php\">abstract readonly class Free {}\nfinal readonly class Dom {}<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode declarar uma classe <code>readonly<\/code> sem propriedades. Efetivamente, isto evita propriedades din\u00e2micas, enquanto ainda permite que as classes crian\u00e7as declarem suas propriedades <code>readonly<\/code> explicitamente.<\/p>\n<p>A seguir, <code>readonly<\/code> classes s\u00f3 podem conter propriedades digitadas &#8211; a mesma regra para declarar propriedades individuais <strong>somente leitura<\/strong>.<\/p>\n<p>Voc\u00ea pode usar a propriedade do tipo <code>mixed<\/code> se voc\u00ea n\u00e3o puder declarar uma propriedade estritamente digitada.<\/p>\n<p>Tentar declarar uma classe <code>readonly<\/code> sem uma propriedade digitada resultar\u00e1 em um erro fatal:<\/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>Al\u00e9m disso, voc\u00ea n\u00e3o pode declarar <code>readonly<\/code> para certas caracter\u00edsticas do PHP:<\/p>\n<ul>\n<li><strong>Enums <\/strong>(como <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#enums\">eles n\u00e3o podem conter nenhuma propriedade<\/a>)<\/li>\n<li><strong>Traits<\/strong><\/li>\n<li><strong>Interfaces<\/strong><\/li>\n<\/ul>\n<p>Tentar declarar qualquer uma dessas funcionalidades como <code>readonly<\/code> resultar\u00e1 em um erro Parse.<\/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>Como no caso de todas as palavras-chave PHP, a palavra-chave <code>readonly<\/code> \u00e9 insens\u00edvel a mai\u00fasculas e min\u00fasculas.<\/p>\n<p>O PHP 8.2 tamb\u00e9m deprecia as propriedades din\u00e2micas (mais sobre isso depois). Mas voc\u00ea n\u00e3o pode impedir que propriedades din\u00e2micas sejam adicionadas a uma classe. No entanto, fazer isso para uma classe <code>readonly<\/code> s\u00f3 resultar\u00e1 em um Erro Fatal.<\/p>\n<pre><code class=\"language-php\">Fatal error: Readonly property Test::$test must have type in ... on line ...<\/code><\/pre>\n<h3>Permitindo <code>true<\/code>, <code>false<\/code>, e <code>null<\/code> como tipos aut\u00f4nomos<\/h3>\n<p>PHP j\u00e1 inclui tipos escalares como <code>int<\/code>, <code>string<\/code>, e <code>bool<\/code>. Isso foi expandido no PHP 8.0 com a adi\u00e7\u00e3o de <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#union-types-2-0\">tipos de uni\u00e3o<\/a>, permitindo que os valores fossem de diferentes tipos. O mesmo RFC tamb\u00e9m permitiu usar <code>false<\/code> e <code>null<\/code> como parte de um tipo de sindicato &#8211; eles n\u00e3o foram permitidos como tipos aut\u00f4nomos, no entanto.<\/p>\n<p>Caso voc\u00ea tentou declarar <code>false<\/code> ou <code>null<\/code> ou como tipos aut\u00f4nomos &#8211; sem que eles fizessem parte de um tipo de sindicato &#8211; isso resultou em um erro fatal.<\/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>Para evitar este cen\u00e1rio, o PHP 8.2 est\u00e1 adicionando suporte para usar <a href=\"https:\/\/wiki.php.net\/rfc\/null-false-standalone-types\"><code>false<\/code> e <code>null<\/code><\/a> como tipos aut\u00f4nomos. Com esta adi\u00e7\u00e3o, o sistema de tipos de PHP \u00e9 mais expressivo e completo. Agora voc\u00ea pode declarar os tipos de retorno, par\u00e2metros e propriedades com precis\u00e3o.<\/p>\n<p>Al\u00e9m disso, o PHP ainda n\u00e3o inclui um tipo <code>true<\/code>, que parece ser uma contraparte natural do tipo <code>false<\/code>. O PHP 8.2 corrige isso e <a href=\"https:\/\/wiki.php.net\/rfc\/true-type\">adiciona suporte para o tipo <code>true<\/code> <\/a> tamb\u00e9m. Ele n\u00e3o permite coer\u00e7\u00e3o, exatamente como o tipo <code>false<\/code> se comporta.<\/p>\n<p>Os tipos <code>true<\/code> e <code>false<\/code> s\u00e3o essencialmente um tipo de uni\u00e3o do tipo <code>bool<\/code> do PHP. Para evitar redund\u00e2ncia, voc\u00ea n\u00e3o pode declarar estes tr\u00eas tipos juntos em um tipo de sindicato. Fazendo isso, resultar\u00e1 em um erro fatal em tempo de compila\u00e7\u00e3o.<\/p>\n<h3>Tipo Disjunctive Normal Form (DNF)<\/h3>\n<p>O <a href=\"https:\/\/en.wikipedia.org\/wiki\/Disjunctive_normal_form\">Disjunctive Normal Form (DNF)<\/a>\u00a0\u00e9 uma forma padronizada de organizar express\u00f5es booleanas. Ela consiste em uma disjun\u00e7\u00e3o de conjun\u00e7\u00f5es &#8211; em termos booleanos, que \u00e9 um <strong>OR de AND<\/strong>.<\/p>\n<p>O aplicativo do DNF \u00e0s declara\u00e7\u00f5es de tipo permite uma maneira padr\u00e3o de escrever <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#pure-intersection-types\">tipos combinados de Uni\u00e3o e Intersec\u00e7\u00e3o<\/a> que o analisador pode lidar. O <a href=\"https:\/\/wiki.php.net\/rfc\/dnf_types\">novo recurso de tipos de DNF<\/a> do PHP 8.2 \u00e9 simples, mas poderoso se usado corretamente.<\/p>\n<p>O RFC d\u00e1 o seguinte exemplo. Ela assume que as seguintes defini\u00e7\u00f5es de interface e classe j\u00e1 existem:<\/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>Com tipos DNF, voc\u00ea pode realizar declara\u00e7\u00f5es de tipo para propriedades, par\u00e2metros e valores de retornos assim:<\/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>Em alguns casos, as propriedades podem n\u00e3o estar nas formas DNF. Declar\u00e1-las como tal resultar\u00e1 em um erro parse. Mas voc\u00ea sempre pode reescrev\u00ea-los como:<\/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>Voc\u00ea deve observar que cada segmento de um tipo DNF deve ser \u00fanico. Por exemplo, declarar <code>(A&B)|(B&A)<\/code> \u00e9 inv\u00e1lido, pois os dois segmentos <strong>OR <\/strong>s\u00e3o logicamente os mesmos.<\/p>\n<p>Al\u00e9m disso, tamb\u00e9m n\u00e3o s\u00e3o permitidos segmentos que s\u00e3o subconjuntos r\u00edgidos do outro segmento. Isso porque o subconjunto j\u00e1 ter\u00e1 todas as inst\u00e2ncias do subconjunto, tornando redundante o uso de DNF.<\/p>\n<h3>Reduzindo par\u00e2metros sens\u00edveis em Back-Trace<\/h3>\n<p>Como quase qualquer <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhor-linguagem-de-programacao\/\">linguagem de programa\u00e7\u00e3o<\/a>, <a href=\"https:\/\/kinsta.com\/php\/\">o PHP<\/a> permite rastrear sua pilha de chamadas em qualquer ponto da execu\u00e7\u00e3o do c\u00f3digo. O rastreamento da pilha facilita a depura\u00e7\u00e3o do c\u00f3digo para corrigir erros e gargalos de desempenho. Ele forma a espinha dorsal de ferramentas como o <a href=\"https:\/\/kinsta.com\/pt\/ferramenta-apm\/\">Kinsta APM<\/a>, nossa <a href=\"https:\/\/kinsta.com\/pt\/blog\/monitoramento-desempenho-aplicativos\/\">ferramenta de monitoramento de desempenho<\/a> customizada para sites WordPress.<\/p>\n<figure id=\"attachment_53140\" aria-describedby=\"caption-attachment-53140\" style=\"width: 1097px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-53140 size-full\" src=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-pt.png\" alt=\"Rastreamento de transa\u00e7\u00f5es lentas de WooCommerce com a Kinsta APM.\" width=\"1097\" height=\"659\" srcset=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-pt.png 1097w, https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-pt-300x180.png 300w, https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-pt-1024x615.png 1024w, https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/Kinsta-APM-WooCommerce-Admin-Slow-Transactions-pt-768x461.png 768w\" sizes=\"auto, (max-width: 1097px) 100vw, 1097px\" \/><figcaption id=\"caption-attachment-53140\" class=\"wp-caption-text\">Rastreamento de transa\u00e7\u00f5es lentas de WooCommerce com a Kinsta APM.<\/figcaption><\/figure>\n<p>A execu\u00e7\u00e3o de um stack trace n\u00e3o impede a execu\u00e7\u00e3o do programa. Normalmente, a maioria dos stack traces s\u00e3o executados em segundo plano, sendo registrados silenciosamente &#8211; para inspe\u00e7\u00e3o posterior, se necess\u00e1rio.<\/p>\n<p>Entretanto, alguns desses stack traces detalhados do PHP podem ser um inconveniente se voc\u00ea os compartilhar com servi\u00e7os de terceiros &#8211; geralmente para <a href=\"https:\/\/kinsta.com\/pt\/blog\/logs-e-erros-do-wordpress\/\">an\u00e1lise de registros de erros<\/a>, rastreamento de erros, etc. Stack traces podem incluir informa\u00e7\u00f5es sens\u00edveis, como nomes de usu\u00e1rio, senhas e vari\u00e1veis de ambiente.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">Esta proposta da RFC<\/a> d\u00e1 um exemplo:<\/p>\n<blockquote><p>Um &#8220;infrator&#8221; comum \u00e9 o PDO que toma a senha do banco de dados como par\u00e2metro do construtor e imediatamente tenta se conectar ao banco de dados dentro do construtor, ao inv\u00e9s de ter um construtor puro e um m\u00e9todo <strong>separado -&gt;connect()<\/strong>. Assim, quando a conex\u00e3o com o banco de dados falhar, o rastreamento da pilha incluir\u00e1 a senha do banco de dados:<\/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>O PHP 8.2 permite que voc\u00ea <a href=\"https:\/\/wiki.php.net\/rfc\/redact_parameters_in_back_traces\">marque esses par\u00e2metros sens\u00edveis<\/a> com um novo atributo <code>\\SensitiveParameter<\/code>. Qualquer par\u00e2metro marcado como sens\u00edvel n\u00e3o ser\u00e1 listado no seu backtraces. Assim, voc\u00ea pode compartilh\u00e1-los sem preocupa\u00e7\u00f5es com qualquer servi\u00e7o de terceiros.<\/p>\n<p>Aqui est\u00e1 um exemplo simples com um \u00fanico par\u00e2metro sens\u00edvel:<\/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 voc\u00ea gera um backtrace, qualquer par\u00e2metro com o atributo <code>\\SensitiveParameter<\/code> ser\u00e1 substitu\u00eddo por um objeto <code>\\SensitiveParameterValue<\/code>, e seu valor real nunca ser\u00e1 armazenado no Trait. O objeto <code>SensitiveParameterValue<\/code> encapsula o valor real do par\u00e2metro &#8211; se voc\u00ea precisar dele por qualquer raz\u00e3o.<\/p>\n<h3>Nova fun\u00e7\u00e3o <code>mysqli_execute_query<\/code> e m\u00e9todo <code>mysqli::execute_query<\/code><\/h3>\n<p>Voc\u00ea j\u00e1 utilizou a fun\u00e7\u00e3o <code>mysqli_query()<\/code> com valores de usu\u00e1rio perigosamente fugindo apenas para executar uma consulta MySQLi parametrizada?<\/p>\n<p>O PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_execute_query\">facilita a execu\u00e7\u00e3o de consultas parametrizadas do MySQLi<\/a> com a nova fun\u00e7\u00e3o <code>mysqli_execute_query($sql, $params)<\/code> e o m\u00e9todo <code>mysqli::execute_query<\/code>.<\/p>\n<p>Essencialmente, esta nova fun\u00e7\u00e3o \u00e9 uma combina\u00e7\u00e3o de <code>mysqli_prepare()<\/code>, <code>mysqli_execute()<\/code>, e <code>mysqli_stmt_get_result()<\/code> fun\u00e7\u00f5es. Com ela, a consulta MySQLi ser\u00e1 preparada, vinculada (se voc\u00ea passar qualquer par\u00e2metro), e executada na pr\u00f3pria fun\u00e7\u00e3o. Caso a consulta for executada com sucesso, ela retornar\u00e1 um objeto <code>mysqli_result<\/code>. Se n\u00e3o for bem-sucedida, ela retornar\u00e1 <code>false<\/code>.<\/p>\n<p>A proposta da RFC d\u00e1 um exemplo simples, mas poderoso:<\/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>Recuperando propriedades do <code>enum<\/code> nas express\u00f5es de <code>const<\/code><\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/fetch_property_in_const_expressions\">Esta RFC prop\u00f5e<\/a> permitir que o operador <code>-&gt;\/?-&gt;<\/code> busque <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#enums\"><code>enum<\/code><\/a> propriedades nas express\u00f5es <code>const<\/code>.<\/p>\n<p>A principal raz\u00e3o para este novo recurso \u00e9 que voc\u00ea n\u00e3o pode usar <code>enum<\/code> objetos em alguns lugares, como chaves de array. Em tal caso, voc\u00ea ter\u00e1 que repetir o valor do caso <code>enum<\/code> apenas para us\u00e1-lo.<\/p>\n<p>Permitir a busca de propriedades <code>enum<\/code> em lugares onde <code>enum<\/code> objetos n\u00e3o s\u00e3o permitidos pode simplificar este procedimento.<\/p>\n<p>Isso significa que o seguinte c\u00f3digo agora \u00e9 v\u00e1lido:<\/p>\n<pre><code class=\"language-php\">const C = [self::B-&gt;value =&gt; self::B];<\/code><\/pre>\n<p>E s\u00f3 por seguran\u00e7a, este RFC tamb\u00e9m inclui suporte para o operador nullsafe <code>?-&gt;<\/code>.<\/p>\n<h3>Permitir constantes em Traits<\/h3>\n<p>PHP inclui uma maneira de reutilizar o c\u00f3digo chamado Traits. Eles s\u00e3o \u00f3timos para o reuso de c\u00f3digo entre classes.<\/p>\n<p>Atualmente, Traits s\u00f3 permitem definir m\u00e9todos e propriedades, mas n\u00e3o constantes. Isso significa que voc\u00ea n\u00e3o pode definir invariantes esperados por um Trait\u00a0no pr\u00f3prio Trait. Para contornar esta limita\u00e7\u00e3o, voc\u00ea precisa definir constantes em sua classe de composi\u00e7\u00e3o ou uma interface implementada por sua classe de composi\u00e7\u00e3o.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/constants_in_traits\">Esta RFC se prop\u00f5e<\/a> a permitir a defini\u00e7\u00e3o de constantes em Traits. Estas constantes podem ser definidas da mesma forma que voc\u00ea definiria constantes de classe. Este exemplo tirado diretamente da RFC limpa o ar ao redor do seu uso:<\/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>Constantes de Traits tamb\u00e9m s\u00e3o fundidas na defini\u00e7\u00e3o da classe compositora, o mesmo que as defini\u00e7\u00f5es de propriedade e m\u00e9todo de um Trait. Elas tamb\u00e9m t\u00eam restri\u00e7\u00f5es similares como propriedades de Traits. Como observado na RFC, esta proposta &#8211; embora seja um bom come\u00e7o &#8211; precisa de mais trabalho para dar corpo \u00e0 funcionalidade.<\/p>\n<h2>Deprecia\u00e7\u00f5es do PHP 8.2<\/h2>\n<p>Podemos agora explorar todas as deprecia\u00e7\u00f5es no PHP 8.2. Esta lista n\u00e3o \u00e9 t\u00e3o grande quanto suas novas funcionalidades:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Deprecia\u00e7\u00e3o de propriedades din\u00e2micas (e novos atributos <code>#[AllowDynamicProperties]<\/code>)<\/h3>\n<p>At\u00e9 o PHP 8.1, voc\u00ea podia <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-vs-javascript\/#typing-of-variables\">definir dinamicamente e recuperar propriedades de classe n\u00e3o declaradas<\/a> no PHP. Por exemplo, o PHP 8.1:<\/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>Aqui, a classe <code>Post<\/code> n\u00e3o declara uma propriedade <code>name<\/code>. Mas como o PHP permite propriedades din\u00e2micas, voc\u00ea pode defini-la fora da declara\u00e7\u00e3o da classe. Essa \u00e9 sua maior &#8211; e possivelmente, a \u00fanica vantagem.<\/p>\n<p>As propriedades din\u00e2micas permitem que bugs e comportamentos inesperados apare\u00e7am em seu c\u00f3digo. Por exemplo, se voc\u00ea cometer algum erro ao declarar uma propriedade de classe fora da classe, \u00e9 f\u00e1cil perd\u00ea-la de vista &#8211; especialmente ao depurar qualquer erro dentro daquela classe.<\/p>\n<p>A partir do PHP 8.2, as <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dynamic_properties\">propriedades din\u00e2micas s\u00e3o depreciadas<\/a>. Definir um valor para uma propriedade de classe n\u00e3o declarada ir\u00e1 emitir um aviso de deprecia\u00e7\u00e3o na primeira vez que a propriedade for definida.<\/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>Entretanto, no PHP 9.0, a configura\u00e7\u00e3o do mesmo ir\u00e1 lan\u00e7ar um erro <code>ErrorException<\/code>.<\/p>\n<p>Caso o seu c\u00f3digo est\u00e1 cheio de propriedades din\u00e2micas &#8211; e h\u00e1 muito c\u00f3digo PHP que est\u00e1 &#8211; e se voc\u00ea quiser parar esses avisos de deprecia\u00e7\u00e3o ap\u00f3s atualizar para o PHP 8.2, voc\u00ea pode usar o novo atributo <code>#[AllowDynamicProperties]<\/code> do PHP 8.2 para permitir propriedades din\u00e2micas nas classes.<\/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>Segundo a RFC, as classes marcadas como <code>#[AllowDynamicProperties]<\/code>, assim como suas classes, podem continuar usando propriedades din\u00e2micas sem deprecia\u00e7\u00f5es ou remo\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea tamb\u00e9m deve notar que, no PHP 8.2, a \u00fanica classe empacotada marcada como <code>#[AllowDynamicProperties]<\/code> \u00e9 <code>stdClass<\/code>. Al\u00e9m disso, quaisquer propriedades acessadas por <code>__get()<\/code> ou <code>__set()<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php\">m\u00e9todos m\u00e1gicos do PHP<\/a> n\u00e3o s\u00e3o considerados propriedades din\u00e2micas, de modo que eles n\u00e3o ir\u00e3o lan\u00e7ar um aviso de deprecia\u00e7\u00e3o.<\/p>\n<h3>Deprecia\u00e7\u00e3o de Callables parcialmente suportados<\/h3>\n<p>Outra mudan\u00e7a no PHP 8.2, embora com um impacto mais insignificante, \u00e9 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_partially_supported_callables\">depreciar os callables parcialmente suportados<\/a>.<\/p>\n<p>Estes callables s\u00e3o chamados parcialmente suportados porque voc\u00ea n\u00e3o pode interagir com eles diretamente via <code>$callable()<\/code>. Voc\u00ea s\u00f3 pode chegar at\u00e9 eles com a fun\u00e7\u00e3o <code>call_user_func($callable)<\/code>. A lista de tais callables n\u00e3o \u00e9 longa:<\/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 partir do PHP 8.2, qualquer tentativa de invocar tais callables &#8211; como, por exemplo, atrav\u00e9s das fun\u00e7\u00f5es <code>call_user_func()<\/code> ou <code>array_map()<\/code> &#8211; lan\u00e7ar\u00e1 um aviso de deprecia\u00e7\u00e3o.<\/p>\n<p>O RFC original d\u00e1 um racioc\u00ednio s\u00f3lido por tr\u00e1s dessa desvaloriza\u00e7\u00e3o:<\/p>\n<blockquote><p><em>Com exce\u00e7\u00e3o dos dois \u00faltimos casos, todos estes callables s\u00e3o dependentes do contexto. O m\u00e9todo a que <code>\"self::method\"<\/code> se refere depende de qual classe a chamada ou verifica\u00e7\u00e3o de callability \u00e9 realizada. Na pr\u00e1tica, isto normalmente tamb\u00e9m \u00e9 v\u00e1lido para os dois \u00faltimos casos, quando usado na forma de <code>[new Foo, \"parent::method\"]<\/code>.<\/em><\/p>\n<p><em>Reduzir a depend\u00eancia do contexto de chamadas \u00e9 o objetivo secund\u00e1rio desta RFC. Depois desta RFC, a \u00fanica depend\u00eancia de escopo ainda resta \u00e9 a visibilidade do m\u00e9todo: <code>\"Foo::bar\"<\/code> pode ser vis\u00edvel em um escopo, mas n\u00e3o em outro. Se os callables fossem limitados a m\u00e9todos p\u00fablicos no futuro (enquanto m\u00e9todos privados teriam que usar callables de primeira classe ou <code>Closure::fromCallable()<\/code> para serem feitos independentes do escopo), ent\u00e3o o tipo callable tornar-se-ia bem definido e poderia ser usado como um tipo de propriedade.<\/em><em>Entretanto, mudan\u00e7as no tratamento da visibilidade n\u00e3o s\u00e3o propostas como parte desta RFC<\/em><\/p><\/blockquote>\n<p>.<br \/>\nDe acordo com a RFC original, a fun\u00e7\u00e3o <code>is_callable()<\/code> e o tipo <code>callable<\/code> continuar\u00e3o a aceitar estes callables como exce\u00e7\u00f5es. Mas somente at\u00e9 que o suporte a elas seja removido inteiramente do PHP 9.0 em diante.<\/p>\n<p>Para evitar confus\u00e3o, o escopo deste aviso de deprecia\u00e7\u00e3o foi <a href=\"https:\/\/wiki.php.net\/rfc\/partially-supported-callables-expand-deprecation-notices\">expandido com uma nova RFC<\/a> &#8211; agora inclui estas exce\u00e7\u00f5es.<\/p>\n<p>\u00c9 bom ver o PHP se movendo para ter um tipo bem definido <code>callable<\/code>.<\/p>\n<h3>Fun\u00e7\u00f5es depreciadas <code>#utf8_encode()<\/code> e <code>utf8_decode()<\/code><\/h3>\n<p>As fun\u00e7\u00f5es integradas do PHP <code>utf8_encode()<\/code> e <code>utf8_decode()<\/code> convertem strings codificadas em ISO-8859-1 (&#8220;Latin 1&#8221;) de e para UTF-8.<\/p>\n<p>No entanto, seus nomes sugerem um uso mais geral do que sua implementa\u00e7\u00e3o permite. A codifica\u00e7\u00e3o &#8220;Latin 1&#8221; \u00e9 comumente confundida com outras codifica\u00e7\u00f5es como a &#8220;Windows Code Page 1252&#8221;<\/p>\n<p>Al\u00e9m disso, voc\u00ea normalmente ver\u00e1 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojibake\">Mojibake<\/a> quando estas fun\u00e7\u00f5es n\u00e3o podem converter nenhuma string corretamente. A falta de mensagens de erro tamb\u00e9m significa que \u00e9 dif\u00edcil identific\u00e1-las, especialmente dentro de um mar de textos leg\u00edveis.<\/p>\n<p>PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/remove_utf8_decode_and_utf8_encode\">deprecia ambas as fun\u00e7\u00f5es <code>#utf8_encode()<\/code> e <code>utf8_decode()<\/code><\/a> . Se voc\u00ea as invocar, voc\u00ea ver\u00e1 estes avisos de deprecia\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-php\">Deprecated: Function utf8_encode() is deprecated\nDeprecated: Function utf8_decode() is deprecated<\/code><\/pre>\n<p>A RFC sugere o uso de <a href=\"https:\/\/kinsta.com\/pt\/blog\/instalar-php\/#all-about-php-extensions\">extens\u00f5es suportadas pelo PHP<\/a>, como <code>mbstring<\/code>, <code>iconv<\/code>, e <code>intl<\/code>.<\/p>\n<h3>Interpola\u00e7\u00e3o de Strings depreciadas de <code>${}<\/code><\/h3>\n<p>O PHP permite incorporar vari\u00e1veis em strings com aspas duplas (<code>\"<\/code>) e heredoc (<code>&lt;&lt;&lt;<\/code>) de v\u00e1rias maneiras:<\/p>\n<ol>\n<li>Incorpora\u00e7\u00e3o direta de vari\u00e1veis &#8211; <code>\u201c$foo\u201d<\/code><\/li>\n<li>Com aparelho fora da vari\u00e1vel &#8211; <code>\u201c{$foo}\u201d<\/code><\/li>\n<li>Com aparelho ap\u00f3s o sinal do d\u00f3lar &#8211; <code>\u201c${foo}\u201d<\/code><\/li>\n<li>Vari\u00e1veis &#8211; <code>\u201c${expr}\u201d<\/code> &#8211; equivalente ao uso de <code>(string) ${expr}<\/code><\/li>\n<\/ol>\n<p>\u00c0s duas primeiras maneiras t\u00eam seus pr\u00f3s e contras, enquanto as duas \u00faltimas t\u00eam uma sintaxe complexa e conflitante. O PHP 8.2 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_dollar_brace_string_interpolation\">deprecia \u00e0s duas \u00faltimas formas de interpola\u00e7\u00e3o de strings<\/a>.<\/p>\n<p>Voc\u00ea deve se afastar de interpolar as strings desta maneira, seguindo em frente:<\/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 partir do PHP 9.0, estas deprecia\u00e7\u00f5es ser\u00e3o atualizadas para lan\u00e7ar um erro de exce\u00e7\u00e3o.<\/p>\n<h3>Fun\u00e7\u00f5es depreciadas de mbstring para entidades Base64\/QPrint\/Uuencode\/HTML<\/h3>\n<p>As fun\u00e7\u00f5es mbstring (multi-byte string) do PHP nos ajudam a trabalhar com Unicode, entidades HTML, e outras codifica\u00e7\u00f5es de texto legado.<\/p>\n<p>Entretanto, Base64, Uuencode e QPrint n\u00e3o s\u00e3o codifica\u00e7\u00f5es de texto e ainda fazem parte dessas fun\u00e7\u00f5es &#8211; principalmente devido a motivos antigos. O PHP tamb\u00e9m inclui implementa\u00e7\u00f5es separadas dessas codifica\u00e7\u00f5es.<\/p>\n<p>Quanto \u00e0s entidades HTML, o PHP tem fun\u00e7\u00f5es incorporadas &#8211; <code>htmlspecialchars()<\/code> e <code>htmlentities()<\/code> &#8211; para lidar melhor com elas. Por exemplo, ao contr\u00e1rio do mbstring, estas fun\u00e7\u00f5es tamb\u00e9m ir\u00e3o converter <code>&lt;<\/code>. <code>&gt;<\/code>, e <code>&<\/code> caracteres para entidades HTML.<\/p>\n<p>Al\u00e9m disso, o PHP est\u00e1 sempre melhorando suas fun\u00e7\u00f5es integradas &#8211; <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#html-encoding-and-decoding-functions-now-use-ent_quotes--ent_substitute\">assim como o PHP 8.1 com fun\u00e7\u00f5es de codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o HTML<\/a>.<\/p>\n<p>Ent\u00e3o, mantendo tudo isso em mente, o PHP 8.2 est\u00e1 <a href=\"https:\/\/github.com\/php\/php-src\/commit\/9308974f8cc6c1046f228be5320fe067913ba987\">depreciando o uso de mbstring para essas codifica\u00e7\u00f5es<\/a> (os r\u00f3tulos s\u00e3o insens\u00edveis a mai\u00fasculas e min\u00fasculas):<\/p>\n<ul>\n<li>BASE64<\/li>\n<li>UUENCODE<\/li>\n<li>HTML-ENTITIES<\/li>\n<li>html (ali\u00e1s de HTML-ENTITIES)<\/li>\n<li>Cita\u00e7\u00e3o-Printable<\/li>\n<li>qprint (ali\u00e1s de Quoted-Printable)<\/li>\n<\/ul>\n<p>A partir do PHP 8.2, usando mbstring para codificar\/decodificar, qualquer um dos itens acima ir\u00e1 emitir um aviso de deprecia\u00e7\u00e3o. O PHP 9.0 remover\u00e1 completamente o suporte a mbstring para estas codifica\u00e7\u00f5es.<\/p>\n<h2>Outras pequenas mudan\u00e7as no PHP 8.2<\/h2>\n<p>Finalmente, n\u00f3s podemos discutir as pequenas mudan\u00e7as do PHP 8.2, incluindo suas caracter\u00edsticas e funcionalidades removidas.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"15\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Suporte removido para libmysql do mysqli<\/h3>\n<p>A partir de agora, o PHP permite que tanto os drivers <code>mysqli<\/code> quanto <code>PDO_mysql<\/code> possam ser constru\u00eddos contra bibliotecas <code>mysqlnd<\/code> e <code>libmysql<\/code>. Entretanto, o driver padr\u00e3o e recomendado desde o PHP 5.4 tem sido <code>mysqlnd<\/code>.<\/p>\n<p>Ambos os motoristas t\u00eam muitas vantagens e desvantagens. No entanto, remover o suporte para um deles &#8211; idealmente, <a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_support_for_libmysql\">remover <code>libmysql<\/code><\/a>, pois n\u00e3o \u00e9 o padr\u00e3o &#8211; simplificar\u00e1 o c\u00f3digo do PHP e os testes unit\u00e1rios.<\/p>\n<p>Para argumentar a favor deste favor, a RFC lista muitas vantagens do <code>mysqlnd<\/code>:<\/p>\n<ul>\n<li>Est\u00e1 empacotado com PHP<\/li>\n<li>Ele usa o gerenciamento de mem\u00f3ria PHP para monitorar o uso de mem\u00f3ria e\u00a0<a href=\"https:\/\/kinsta.com\/pt\/blog\/desempenho-laravel\/\">melhorar o desempenho<\/a><\/li>\n<li>Fornece fun\u00e7\u00f5es de qualidade de vida (por exemplo, <code>get_result()<\/code>)<\/li>\n<li>Retorna valores num\u00e9ricos usando tipos nativos PHP<\/li>\n<li>Sua funcionalidade n\u00e3o depende da biblioteca externa<\/li>\n<li>Funcionalidade de plugin opcional<\/li>\n<li>Suporta consultas ass\u00edncronas<\/li>\n<\/ul>\n<p>O RFC tamb\u00e9m lista algumas vantagens do <code>libmysql<\/code>, incluindo:<\/p>\n<ul>\n<li>Autorreconex\u00e3o \u00e9 poss\u00edvel (\u2063<code>mysqlnd<\/code> n\u00e3o suporta esta funcionalidade intencionalmente porque pode ser facilmente explorada)<\/li>\n<li>Modos de autentica\u00e7\u00e3o LDAP e SASL (<code>mysqlnd<\/code> <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6447\">pode adicionar este recurso<\/a> em breve tamb\u00e9m)<\/li>\n<\/ul>\n<p>Al\u00e9m disso, a RFC lista muitas desvantagens do <code>libmysql<\/code> &#8211; incompatibilidade com o modelo de mem\u00f3ria PHP, muitos testes falhos, vazamentos de mem\u00f3ria, diferentes funcionalidades entre vers\u00f5es, etc.<\/p>\n<p>Tendo tudo isso em mente, o PHP 8.2 removeu o suporte \u00e0 constru\u00e7\u00e3o <code>mysqli<\/code> contra <code>libmysql<\/code>.<\/p>\n<p>Caso voc\u00ea quiser adicionar qualquer funcionalidade que esteja dispon\u00edvel apenas com <code>libmysql<\/code>, voc\u00ea ter\u00e1 que adicion\u00e1-la explicitamente a<code> mysqlnd<\/code> como uma solicita\u00e7\u00e3o de recurso. Al\u00e9m disso, voc\u00ea n\u00e3o pode adicionar autorreconex\u00e3o.<\/p>\n<h3>Convers\u00e3o de caso independente do Locale-Independent<\/h3>\n<p>Antes do <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\">PHP 8.0<\/a>, o locale do PHP era herdado do ambiente do sistema. Mas isso poderia causar um problema em alguns casos extremos.<\/p>\n<p>Configurando sua linguagem durante a instala\u00e7\u00e3o do Linux, definir\u00e1 a linguagem apropriada da interface do usu\u00e1rio para <a href=\"https:\/\/kinsta.com\/pt\/blog\/comandos-linux\/\">seus comandos embutidos<\/a>. No entanto, isso tamb\u00e9m muda inesperadamente como a funcionalidade de manipula\u00e7\u00e3o de strings da biblioteca C funciona.<\/p>\n<p>Por exemplo, se voc\u00ea selecionou a linguagem &#8220;Turco&#8221; ou &#8220;Cazaque&#8221; ao instalar o Linux, voc\u00ea ver\u00e1 que ligando para <code>toupper('i')<\/code> para obter seu equivalente em mai\u00fasculas obteria o <a href=\"https:\/\/www.wikiwand.com\/en\/%C4%B0\">capital I pontilhado<\/a> (U+0130, <code>\u0130<\/code>).<\/p>\n<p>O PHP 8.0 parou esta anomalia ao definir o local padr\u00e3o como &#8220;C&#8221;, a menos que o usu\u00e1rio o mude explicitamente via <code>setlocale()<\/code>.<\/p>\n<p>O PHP 8.2 vai ainda mais longe, <a href=\"https:\/\/wiki.php.net\/rfc\/strtolower-ascii\">removendo a sensibilidade local das convers\u00f5es de caso<\/a>. Esta RFC muda principalmente <code>strtolower()<\/code>, <code>strtoupper()<\/code>, e fun\u00e7\u00f5es relacionadas. Leia a RFC para obter uma lista de todas as fun\u00e7\u00f5es afetadas.<\/p>\n<p>Como alternativa, se voc\u00ea quiser usar a convers\u00e3o de casos localizados, ent\u00e3o voc\u00ea pode usar <code>mb_strtolower()<\/code>.<\/p>\n<h3>Melhoria da extens\u00e3o aleat\u00f3ria (Random)<\/h3>\n<p>O PHP est\u00e1 planejando <a href=\"https:\/\/wiki.php.net\/rfc\/rng_extension\">revisar sua funcionalidade aleat\u00f3ria (Random)<\/a>.<\/p>\n<p>A partir de agora, a funcionalidade aleat\u00f3ria do PHP depende muito do <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mersenne_Twister\">estado do Mersenne Twister<\/a>. Entretanto, este estado \u00e9 implicitamente armazenado na \u00e1rea global do PHP &#8211; n\u00e3o h\u00e1 como um usu\u00e1rio acess\u00e1-lo. Adicionar fun\u00e7\u00f5es de aleatoriza\u00e7\u00e3o entre o est\u00e1gio inicial de semeadura e o uso pretendido quebraria o c\u00f3digo.<\/p>\n<p>Manter tal c\u00f3digo pode ser ainda mais complicado quando o seu c\u00f3digo usa pacotes externos.<\/p>\n<p>Assim, a funcionalidade aleat\u00f3ria atual do PHP n\u00e3o pode reproduzir valores aleat\u00f3rios consistentemente. Ela at\u00e9 falha nos testes estat\u00edsticos emp\u00edricos de geradores de n\u00fameros aleat\u00f3rios uniformes, como o <a href=\"http:\/\/simul.iro.umontreal.ca\/testu01\/tu01.html\">TestU01&#8217;s Crush e BigCrush<\/a>. A limita\u00e7\u00e3o de 32 bits do Mersenne Twister exacerba ainda mais isso.<\/p>\n<p>Assim, usar as fun\u00e7\u00f5es embutidas do PHP &#8211; <code>shuffle()<\/code>, <code>str_shuffle()<\/code>, <code>array_rand()<\/code> &#8211; n\u00e3o \u00e9 recomendado se voc\u00ea precisar de n\u00fameros aleat\u00f3rios criptografados e seguros. Nesses casos, voc\u00ea precisar\u00e1 implementar uma nova fun\u00e7\u00e3o usando <code>random_int()<\/code> ou fun\u00e7\u00f5es similares.<\/p>\n<p>Entretanto, <a href=\"https:\/\/wiki.php.net\/rfc\/random_extension_improvement\">v\u00e1rias quest\u00f5es com esta RFC<\/a> foram levantadas ap\u00f3s o in\u00edcio da vota\u00e7\u00e3o. Este rev\u00e9s for\u00e7ou a equipe PHP a anotar todas as quest\u00f5es em uma RFC separada, com uma op\u00e7\u00e3o de c\u00e9dula criada para cada quest\u00e3o. Eles decidir\u00e3o ir mais longe somente ap\u00f3s chegar a um consenso.<\/p>\n<h2>RFCs adicionais no PHP 8.2<\/h2>\n<p>O PHP 8.2 tamb\u00e9m inclui novas fun\u00e7\u00f5es e pequenas mudan\u00e7as. Iremos mencion\u00e1-las abaixo com links para recursos adicionais:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8720\">Nova fun\u00e7\u00e3o <code>curl_upkeep<\/code><\/a>: O PHP 8.2 adiciona esta nova fun\u00e7\u00e3o \u00e0 sua extens\u00e3o Curl. Ela chama a fun\u00e7\u00e3o <code>curl_easy_upkeep()<\/code> na libcurl, a biblioteca C subjacente que a extens\u00e3o Curl do PHP usa.<\/li>\n<li><a href=\"https:\/\/php.watch\/versions\/8.2\/ini_parse_quantity\">Nova fun\u00e7\u00e3o <code>ini_parse_quantity<\/code><\/a>: As diretrizes INI do PHP aceitam tamanhos de dados com um sufixo multiplicador. Por exemplo, voc\u00ea pode escrever 25 Megabytes como <code>25M<\/code>, ou 42 Gigabytes como apenas <code>42G<\/code>. Estes sufixos s\u00e3o comuns nos arquivos INI do PHP, mas s\u00e3o incomuns em outros lugares. Esta nova fun\u00e7\u00e3o analisa os <a href=\"https:\/\/kinsta.com\/pt\/blog\/aumentar-tamanho-maximo-upload-wordpress\/#create-or-modify-the-phpini-file\">valores do PHP INI<\/a> e retorna seu tamanho de dados em bytes.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/8151\/files\">Nova fun\u00e7\u00e3o <code>memory_reset_peak_usage<\/code>:<\/a> Esta fun\u00e7\u00e3o redefine o pico de uso de mem\u00f3ria retornado pela fun\u00e7\u00e3o <code>memory_get_peak_usage<\/code>. Ela pode ser \u00fatil quando voc\u00ea estiver executando a mesma a\u00e7\u00e3o v\u00e1rias vezes e quiser gravar o uso de mem\u00f3ria de pico de cada execu\u00e7\u00e3o.<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/pull\/7583\">Suporte para modificador sem captura (<code>\/n<\/code>) em fun\u00e7\u00f5es <code>preg_*<\/code><\/a>: No regex, os meta caracteres <code>()<\/code> indicam um grupo de captura. Isso significa que todas as correspond\u00eancias para a express\u00e3o no par\u00eantese s\u00e3o retornadas. O PHP 8.2 adiciona um modificador de n\u00e3o captura (<code>\/n<\/code>) para parar este comportamento.<\/li>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/iterator_xyz_accept_array\">Fa\u00e7a a fam\u00edlia <code>iterator_*()<\/code> aceitar todos os iterables<\/a>: A partir de agora, a fam\u00edlia <code>iterator_*()<\/code> do PHP s\u00f3 aceita <code>\\Traversables<\/code> (ou seja, n\u00e3o s\u00e3o permitidos arrays simples). \u00c9 desnecessariamente limitador, e este RFC corrige isso.<\/li>\n<\/ol>\n<h2>Resumo<\/h2>\n<p>O PHP 8.2 se baseia nas enormes melhorias do PHP 8.0 e PHP 8.1, o que n\u00e3o \u00e9 um feito f\u00e1cil. Pensamos que as caracter\u00edsticas mais excitantes do PHP 8.2 s\u00e3o seus novos tipos aut\u00f4nomos, propriedades somente de leitura e numerosas melhorias de desempenho.<\/p>\n<p>Mal podemos esperar para <a href=\"https:\/\/kinsta.com\/pt\/blog\/benchmarks-definitivos-do-php\/\">comparar o PHP<\/a> 8.2 com v\u00e1rios <a href=\"https:\/\/kinsta.com\/pt\/blog\/frameworks-php-populares\/\">frameworks PHP<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/wordpress-quota-mercado\/\">CMS<\/a>.<\/p>\n<p><em>Quais funcionalidades do PHP 8.2 s\u00e3o as suas favoritas? Quais deprecia\u00e7\u00f5es s\u00e3o as suas menos favoritas? Por favor, compartilhe seus pensamentos com nossa comunidade nos coment\u00e1rios!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O PHP 8.2 se baseia nas novas bases do PHP 8.0 e do PHP 8.1. Agora que o PHP 8.2 foi lan\u00e7ado, vamos nos aprofundar no &#8230;<\/p>\n","protected":false},"author":117,"featured_media":52069,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[998],"class_list":["post-52068","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-atualizacoes-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>O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais<\/title>\n<meta name=\"description\" content=\"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.\" \/>\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\/pt\/blog\/php-8-2\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais\" \/>\n<meta property=\"og:description\" content=\"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-11T12:23:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T07:47:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.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=\"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"O que H\u00e1 de Novo no PHP 8.2 &#8211; Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais\",\"datePublished\":\"2022-08-11T12:23:11+00:00\",\"dateModified\":\"2023-08-22T07:47:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\"},\"wordCount\":3734,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\",\"name\":\"O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png\",\"datePublished\":\"2022-08-11T12:23:11+00:00\",\"dateModified\":\"2023-08-22T07:47:00+00:00\",\"description\":\"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Atualiza\u00e7\u00f5es do PHP\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/atualizacoes-php\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"O que H\u00e1 de Novo no PHP 8.2 &#8211; Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais","description":"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.","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\/pt\/blog\/php-8-2\/","og_locale":"pt_PT","og_type":"article","og_title":"O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais","og_description":"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.","og_url":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-08-11T12:23:11+00:00","article_modified_time":"2023-08-22T07:47:00+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Salman Ravoof","Tempo estimado de leitura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"O que H\u00e1 de Novo no PHP 8.2 &#8211; Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais","datePublished":"2022-08-11T12:23:11+00:00","dateModified":"2023-08-22T07:47:00+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/"},"wordCount":3734,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/","url":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/","name":"O que H\u00e1 de Novo no PHP 8.2 - Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","datePublished":"2022-08-11T12:23:11+00:00","dateModified":"2023-08-22T07:47:00+00:00","description":"PHP 8.2. Publicados. Descubra todos os novos recursos, melhorias, deprecia\u00e7\u00f5es e pequenas altera\u00e7\u00f5es com o lan\u00e7amento.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/php-8-2\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/08\/whats-new-in-php-82.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Atualiza\u00e7\u00f5es do PHP","item":"https:\/\/kinsta.com\/pt\/topicos\/atualizacoes-php\/"},{"@type":"ListItem","position":3,"name":"O que H\u00e1 de Novo no PHP 8.2 &#8211; Novas Funcionalidades, Deprecia\u00e7\u00f5es, Mudan\u00e7as e Muito Mais"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=52068"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52068\/revisions"}],"predecessor-version":[{"id":56163,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/52068\/revisions\/56163"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/en"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/it"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/es"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/translations\/se"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/52068\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/52069"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=52068"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=52068"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=52068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}