{"id":44036,"date":"2021-09-02T11:01:12","date_gmt":"2021-09-02T09:01:12","guid":{"rendered":"https:\/\/kinsta.com\/?p=101567"},"modified":"2025-02-26T10:49:25","modified_gmt":"2025-02-26T13:49:25","slug":"php-8-1","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/","title":{"rendered":"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais"},"content":{"rendered":"<p>Lan\u00e7ado em 25 de novembro de 2021, o <a href=\"https:\/\/wiki.php.net\/todo\/php81\">PHP 8.1 est\u00e1 finalmente aqui<\/a>, repleto de v\u00e1rias funcionalidades interessantes.<\/p>\n<p>Neste artigo, vamos cobrir em detalhes o que h\u00e1 de novo no PHP 8.1. Desde suas novas funcionalidades e melhorias de desempenho at\u00e9 mudan\u00e7as e deprecia\u00e7\u00f5es significativas, vamos passar por todas elas em profundidade.<\/p>\n<p>Vamos nessa!<\/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 do PHP 8.1<\/h2>\n<p>Vamos come\u00e7ar cobrindo todas as novas funcionalidades do PHP 8.1. \u00c9 uma lista e tanto.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"20\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>O PHP 8.1 est\u00e1 agora dispon\u00edvel na Kinsta para todos os ambientes. Por favor, verifique nossa <a href=\"https:\/\/kinsta.com\/pt\/changelog\/php-8-1\/\">atualiza\u00e7\u00e3o de funcionalidades do PHP 8.1<\/a> para mais informa\u00e7\u00f5es.<\/p>\n<\/aside>\n\n\n<h3>Pure Intersection Types<\/h3>\n<p>O PHP 8.1 adiciona suporte para Pure Intersection Types. \u00c9 similar aos <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#union-types-2-0\">union types<\/a> introduzidos no PHP 8.0, mas seu uso pretendido \u00e9 exatamente o oposto.<\/p>\n<p>Para entender melhor o seu uso, vamos refrescar como funcionam as declara\u00e7\u00f5es type no PHP.<\/p>\n<p>Essencialmente, voc\u00ea pode adicionar declara\u00e7\u00f5es type a argumentos de fun\u00e7\u00e3o, valores de retorno e propriedades de classe. Essa atribui\u00e7\u00e3o \u00e9 chamada de sugest\u00e3o type e garante que o valor seja do tipo correto no momento da chamada. Caso contr\u00e1rio, ele lan\u00e7a um <a href=\"https:\/\/www.php.net\/manual\/en\/class.typeerror.php\">TypeError<\/a> imediatamente. Por sua vez, isso ajuda a depurar melhor o c\u00f3digo.<\/p>\n<p>No entanto, declarar um \u00fanico type tem as suas limita\u00e7\u00f5es. Union types ajudam a superar isso, permitindo que voc\u00ea declare um valor com v\u00e1rios types, e a entrada tem que satisfazer pelo menos um dos types declarados.<\/p>\n<p>Por outro lado, <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types\">a RFC<\/a> descreve os Intersection Types como:<\/p>\n<blockquote><p><em>Um &#8220;Intersection Types&#8221; requer um valor para satisfazer restri\u00e7\u00f5es de v\u00e1rios types em vez de um \u00fanico.<\/em><\/p>\n<p><em>&#8230;Pure Intersection Types s\u00e3o especificados usando a sintaxe T1&#038;T2&#038;&#8230; e podem ser usadas em todas as posi\u00e7\u00f5es onde os types s\u00e3o aceitos atualmente&#8230;<\/em><\/p><\/blockquote>\n<p>Observe o uso de <code>&<\/code> (AND) operador para declarar os Intersection Types. Em contraste, n\u00f3s usamos o operador <code>|<\/code> (OR) para declarar os union types.<\/p>\n<p>O uso da maioria dos types padr\u00e3o em um Intersection Types resultar\u00e1 em um tipo que nunca poder\u00e1 ser cumprido (por exemplo, integer e string). Assim, os Intersection Types s\u00f3 podem incluir types de classe (ou seja, interfaces e nomes de classe).<\/p>\n<p>Aqui est\u00e1 um exemplo de c\u00f3digo mostrando como voc\u00ea pode usar o Intersection Types:<\/p>\n<pre><code class=\"language-php\">class A {\n\u00a0 \u00a0 private Traversable&Countable $countableIterator;\n \n\u00a0 \u00a0 public function setIterator(Traversable&Countable $countableIterator): void {\n\u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;countableIterator = $countableIterator;\n\u00a0 \u00a0 }\n \n\u00a0 \u00a0 public function getIterator(): Traversable&Countable {\n\u00a0 \u00a0 \u00a0 \u00a0 return $this-&gt;countableIterator;\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>No c\u00f3digo acima, definimos um <strong>countableIterator <\/strong>vari\u00e1vel como uma interse\u00e7\u00e3o de dois types: <strong>Traversable<\/strong><strong>\u00a0<\/strong>e <strong>Countable<\/strong>. Neste caso, os dois types declarados s\u00e3o interfaces.<\/p>\n<p>Intersection Types tamb\u00e9m est\u00e3o em conformidade com as regras de vari\u00e2ncia padr\u00e3o do PHP j\u00e1 utilizadas para verifica\u00e7\u00e3o de types e heran\u00e7a. Mas h\u00e1 duas regras adicionais com como os Intersection Types interagem com a subtipagem. Voc\u00ea pode ler mais sobre as <a href=\"https:\/\/wiki.php.net\/rfc\/pure-intersection-types#variance\">regras de vari\u00e2ncia dos Intersection Types<\/a>\u00a0em sua RFC.<\/p>\n<p>Em algumas linguagens de programa\u00e7\u00e3o, voc\u00ea pode combinar UnionTypes e Intersection Types na mesma declara\u00e7\u00e3o. Mas o PHP 8.1 o pro\u00edbe. Portanto, sua implementa\u00e7\u00e3o \u00e9 chamada de Pure Intersection Types. No entanto, a RFC menciona que ela \u00e9 &#8220;deixada como um escopo futuro&#8221;.<\/p>\n<h3>Enums<\/h3>\n<p>O PHP 8.1 est\u00e1 finalmente adicionando suporte para enums (tamb\u00e9m chamadas de enumera\u00e7\u00f5es ou types enumerados). Eles s\u00e3o um tipo de dados definido pelo usu\u00e1rio que consiste em um conjunto de valores poss\u00edveis.<\/p>\n<p>O exemplo mais comum de enums em linguagens de programa\u00e7\u00e3o \u00e9 o type <strong>booleano<\/strong>, com <code>true<\/code> e <code>false<\/code> como dois valores poss\u00edveis. \u00c9 t\u00e3o comum que \u00e9 utilizado em muitas <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhor-linguagem-de-programacao\/\">linguagens de programa\u00e7\u00e3o modernas<\/a>.<\/p>\n<p>De acordo com <a href=\"https:\/\/wiki.php.net\/rfc\/enumerations\">a RFC<\/a>, enums no PHP ser\u00e3o restritos a &#8220;enumera\u00e7\u00f5es de unidades&#8221; no in\u00edcio:<\/p>\n<blockquote><p><em>O escopo desta RFC est\u00e1 limitado a &#8220;enumera\u00e7\u00f5es unit\u00e1rias&#8221;, ou seja, enumera\u00e7\u00f5es que s\u00e3o em si um valor, ao inv\u00e9s de simplesmente uma sintaxe extravagante para uma constante primitiva, e n\u00e3o incluem informa\u00e7\u00f5es adicionais associadas. Esta capacidade oferece um suporte bastante expandido para modelagem de dados, defini\u00e7\u00f5es de tipo personalizadas e comportamento no estilo monad. Enums habilitam a t\u00e9cnica de modelagem de &#8220;tornar os estados inv\u00e1lidos n\u00e3o representativos&#8221;, o que leva a um c\u00f3digo mais robusto com menos necessidade de testes exaustivos.<\/em><\/p><\/blockquote>\n<p>Para chegar a esta fase, a equipe do PHP estudou muitas linguagens que j\u00e1 suportam enumera\u00e7\u00f5es. A <a href=\"https:\/\/github.com\/Crell\/enum-comparison\">pesquisa deles<\/a> descobriu que voc\u00ea pode categorizar as enumera\u00e7\u00f5es em tr\u00eas grupos gerais: Fancy Constants, Fancy Objects, e Tipos de dados alg\u00e9bricos completos (ADTs). \u00c9 uma leitura interessante!<\/p>\n<p>PHP implementa enums \u201cFancy Objects\u201d, com planos para estend\u00ea-lo para ADTs completos no futuro. Ele \u00e9 conceitual e semanticamente modelado ap\u00f3s os tipos enumerados no Swift, Rust e Kotlin, embora n\u00e3o seja modelado diretamente em nenhum deles.<\/p>\n<p>O RFC usa a famosa analogia de naipes em um baralho de cartas para explicar como funcionar\u00e1:<\/p>\n<pre><code class=\"language-php\">enum Suit {\n\u00a0 case Hearts;\n\u00a0 case Diamonds;\n\u00a0 case Clubs;\n\u00a0 case Spades;\n}<\/code><\/pre>\n<p>Aqui, o enum <strong>Suit<\/strong> define quatro valores poss\u00edveis: <strong>Hearts<\/strong>,\u00a0<strong>Diamonds<\/strong>,\u00a0<strong>Clubs<\/strong> e\u00a0<strong>Spades<\/strong>. Voc\u00ea pode acessar esses valores diretamente usando a sintaxe: <code>Suit::Hearts<\/code>, <code>Suit::Diamonds<\/code>, <code>Suit::Clubs<\/code>, e\u00a0<code>Suit::Spades<\/code>.<\/p>\n<p>Este uso pode parecer familiar, uma vez que os enums s\u00e3o constru\u00eddos sobre classes e objetos. Eles se comportam de forma semelhante e t\u00eam quase os requisitos exatos. Os enums compartilham os mesmos namespaces que as classes, interfaces e tra\u00e7os.<\/p>\n<p>Os enums mencionados acima s\u00e3o chamados de <strong>Pure Enums<\/strong>.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode definir os<strong> Backed Enums <\/strong>se quiser dar um valor equivalente em escala a qualquer caso. No entanto, os Backed Enums podem ter apenas um type, seja <code>int<\/code> ou <code>string<\/code> (nunca ambos).<\/p>\n<pre><code class=\"language-php\">enum Suit: string {\n\u00a0 case Hearts = 'H';\n\u00a0 case Diamonds = 'D';\n\u00a0 case Clubs = 'C';\n\u00a0 case Spades = 'S';\n}<\/code><\/pre>\n<p>Al\u00e9m disso, todos os diferentes casos de um enumera\u00e7\u00e3o apoiada devem ter um valor \u00fanico. E voc\u00ea nunca pode misturar e pure e backed enums.<\/p>\n<p>A RFC se aprofunda em m\u00e9todos de enumera\u00e7\u00e3o, m\u00e9todos est\u00e1ticos, constantes, express\u00f5es constantes, e muito mais. Cobri-los a todos est\u00e1 al\u00e9m do escopo deste artigo. Voc\u00ea pode consultar a documenta\u00e7\u00e3o para se familiarizar com toda a sua bondade.<\/p>\n<h3>O type de retorno <code>never<\/code><\/h3>\n<p>O PHP 8.1 adiciona uma nova dica do type de retorno chamado <code>never<\/code>. \u00c9 super \u00fatil para usar em fun\u00e7\u00f5es que sempre <code>throw<\/code> ou <code>exit<\/code>.<\/p>\n<p>Segundo <a href=\"https:\/\/wiki.php.net\/rfc\/noreturn_type\">a RFC<\/a>, as fun\u00e7\u00f5es de redirecionamento de URL que sempre <code>exit<\/code> (expl\u00edcita ou implicitamente) s\u00e3o um bom exemplo para o seu uso:<\/p>\n<pre><code class=\"language-php\">function redirect(string $uri): never {\n\u00a0 \u00a0 header('Location: ' . $uri);\n\u00a0 \u00a0 exit();\n}\n \nfunction redirectToLoginPage(): never {\n\u00a0 \u00a0 redirect('\/login');\n}<\/code><\/pre>\n<p>Uma fun\u00e7\u00e3o <code>never<\/code> declarada deve satisfazer tr\u00eas condi\u00e7\u00f5es:<\/p>\n<ul>\n<li>N\u00e3o deve ter a declara\u00e7\u00e3o <code>return<\/code> definida explicitamente.<\/li>\n<li>N\u00e3o deve ter a declara\u00e7\u00e3o <code>return<\/code> definida implicitamente (por exemplo, declara\u00e7\u00f5es <strong>if-else<\/strong>).<\/li>\n<li>Deve terminar a sua execu\u00e7\u00e3o com uma declara\u00e7\u00e3o <code>exit<\/code> (expl\u00edcita ou implicitamente).<\/li>\n<\/ul>\n<p>O exemplo de <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/regras-de-redirecionamento\/\">redirecionamento de URL<\/a> acima mostra tanto o uso expl\u00edcito quanto impl\u00edcito do tipo <code>never<\/code> retorno.<\/p>\n<p>O type de retorno <code>never<\/code> partilha muitas semelhan\u00e7as com o type de retorno <code>void<\/code>. Ambos asseguram que a fun\u00e7\u00e3o ou m\u00e9todo n\u00e3o retorna um valor. No entanto, ele difere pelo aplicativo de regras mais estritas. Por exemplo, uma fun\u00e7\u00e3o declarada <code>void<\/code> ainda pode sem um valor expl\u00edcito <code>return<\/code>, mas voc\u00ea n\u00e3o pode fazer o mesmo com uma fun\u00e7\u00e3o <code>never<\/code> declarada.<\/p>\n<p>Como regra geral, v\u00e1 com <code>void<\/code> quando voc\u00ea espera que o PHP continue executando ap\u00f3s a chamada da fun\u00e7\u00e3o. V\u00e1 com <code>never<\/code> quando voc\u00ea quer o oposto.<\/p>\n<p>Al\u00e9m disso, <code>never<\/code> \u00e9 definido como um tipo &#8220;inferior&#8221;. Portanto, qualquer m\u00e9todo de classe declarado <code>never<\/code> pode &#8220;nunca&#8221; mudar o seu tipo de retorno para outra coisa. No entanto, voc\u00ea pode estender um m\u00e9todo declarado <code>void<\/code> com um m\u00e9todo <code>never<\/code> declarado.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>O RFC original lista o type de retorno <code>never<\/code> como <code>noreturn<\/code>, que era um tipo de retorno j\u00e1 suportado por duas ferramentas de an\u00e1lise est\u00e1tica do PHP, nomeadamente o Psalm e o PHPStan. Como isso foi proposto pelos pr\u00f3prios autores do Salmo e do PHPStan, eles mantiveram sua terminologia. Entretanto, devido \u00e0s conven\u00e7\u00f5es de nomenclatura, a equipe do PHP conduziu uma pesquisa para <code>noreturn<\/code> vs <code>never<\/code>, sem <code>never<\/code> emergir como o vencedor para sempre. Portanto, para as vers\u00f5es do PHP 8.1+, sempre substitua <code>noreturn<\/code> por <code>never<\/code>.<\/p>\n<\/aside>\n\n<h3>Fibers<\/h3>\n<p>Historicamente, o c\u00f3digo PHP tem sido quase sempre c\u00f3digo s\u00edncrono. A execu\u00e7\u00e3o do c\u00f3digo para at\u00e9 que o resultado seja retornado, mesmo para opera\u00e7\u00f5es de E\/S. Voc\u00ea pode imaginar porque este processo pode tornar a execu\u00e7\u00e3o do c\u00f3digo mais lenta.<\/p>\n<p>Existem v\u00e1rias solu\u00e7\u00f5es de terceiros para superar este obst\u00e1culo para permitir aos desenvolvedores escrever c\u00f3digo PHP de forma ass\u00edncrona, especialmente para opera\u00e7\u00f5es de E\/S simult\u00e2neas. Alguns exemplos populares incluem <a href=\"https:\/\/amphp.org\/\">amphp<\/a>, <a href=\"https:\/\/reactphp.org\/\">ReactPHP<\/a>, e <a href=\"https:\/\/guzzlephp.org\/\">Guzzle<\/a>.<\/p>\n<p>No entanto, n\u00e3o h\u00e1 uma maneira padr\u00e3o de lidar com tais inst\u00e2ncias no PHP. Al\u00e9m disso, tratar c\u00f3digo s\u00edncrono e ass\u00edncrono na mesma call stack <a href=\"https:\/\/journal.stuffwithstuff.com\/2015\/02\/01\/what-color-is-your-function\/\">leva a outros problemas<\/a>.<\/p>\n<p>Fibers s\u00e3o a forma do PHP lidar com o paralelismo atrav\u00e9s de threads virtuais (ou <a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_threads\">green threads<\/a>). Ela procura eliminar a diferen\u00e7a entre c\u00f3digo s\u00edncrono e ass\u00edncrono, permitindo que fun\u00e7\u00f5es PHP interrompam sem afetar toda a call stack.<\/p>\n<p>Aqui est\u00e1 o que <a href=\"https:\/\/wiki.php.net\/rfc\/fibers\">o RFC<\/a> <em>promete<\/em>:<\/p>\n<ul>\n<li>Adicionar suporte para Fibers ao PHP.<\/li>\n<li>Apresentar uma nova classe de Fiber\u00a0e a correspondente classe de reflex\u00e3o ReflectionFiber.<\/li>\n<li>Adicionar as classes de exce\u00e7\u00e3o FiberError e FiberExit para representar erros.<\/li>\n<li>Fibers permitem implementa\u00e7\u00f5es transparentes de E\/S sem bloqueio das interfaces existentes (PSR-7, Doctrine ORM, etc.). Isso porque o objeto placeholder (promessa) \u00e9 eliminado. Ao inv\u00e9s disso, as fun\u00e7\u00f5es podem declarar o tipo de resultado de I\/O em vez de um objeto placeholder que n\u00e3o pode especificar um tipo de resolu\u00e7\u00e3o porque o PHP n\u00e3o suporta gen\u00e9ricos.<\/li>\n<\/ul>\n<p>Voc\u00ea pode usar Fibers para desenvolver fun\u00e7\u00f5es de PHP com full-stack e interrupt\u00edvel, que voc\u00ea pode ent\u00e3o usar para implementar multitarefas cooperativas em PHP. Como Fibers pausa toda a <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/monitoramento-wordpress\/ferramenta-apm\/#stack-trace\">execution stack<\/a>, voc\u00ea pode ficar tranquilo sabendo que n\u00e3o prejudicar\u00e1 o resto do seu c\u00f3digo.<\/p>\n<figure id=\"attachment_110018\" aria-describedby=\"caption-attachment-110018\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110018 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/08\/PHP-8.1-fiber-flow-e1637845079600.png\" alt=\"Gr\u00e1fico que ilustra o fluxo de execu\u00e7\u00e3o do c\u00f3digo PHP com Fibras \" width=\"1100\" height=\"894\"><\/a><figcaption id=\"caption-attachment-110018\" class=\"wp-caption-text\">Gr\u00e1fico que ilustra o fluxo de execu\u00e7\u00e3o do c\u00f3digo PHP com Fibras (Fonte: PHP.net).<\/figcaption><\/figure>\n<p>Para ilustrar o uso de Fibers, o seu RFC usa este exemplo simples:<\/p>\n<pre><code class=\"language-php\">$fiber = new Fiber(function (): void {\n\u00a0 \u00a0 $value = Fiber::suspend('fiber');\n\u00a0 \u00a0 echo \"Value used to resume fiber: \", $value, \"\\n\";\n});\n \n$value = $fiber-&gt;start();\n \necho \"Value from fiber suspending: \", $value, \"\\n\";\n \n$fiber-&gt;resume('test');<\/code><\/pre>\n<p>Voc\u00ea est\u00e1 criando uma &#8220;Fiber&#8221; no c\u00f3digo acima e suspendendo-a imediatamente com a <code>fiber<\/code> da string. A declara\u00e7\u00e3o de <code>echo<\/code> serve como um sinal visual para a retomada da Fiber\u00a0.<\/p>\n<p>Voc\u00ea pode recuperar o valor desta string a partir da chamada para <code>$fiber-&gt; start()<\/code>.<\/p>\n<p>Em seguida, voc\u00ea retoma a Fiber\u00a0com a string &#8220;test&#8221;, que \u00e9 retornada da chamada para <code>Fiber::suspend()<\/code>. A execu\u00e7\u00e3o completa do c\u00f3digo resulta em uma sa\u00edda que l\u00ea:<\/p>\n<pre><code class=\"language-php\">Value from fiber suspending: fiber\nValue used to resume fiber: test<\/code><\/pre>\n<p>Esse \u00e9 o exemplo de barebones textbook do PHP Fibers no trabalho. <a style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\" href=\"https:\/\/github.com\/nox7\/async-php-8-io-http\">Aqui est\u00e1 outro exemplo de Fibers<\/a>\u00a0de<span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\"> realizar sete pedidos de GET ass\u00edncronos.<\/span><\/p>\n<p>Com tudo o que foi dito e feito, a maioria dos desenvolvedores de PHP nunca ir\u00e3o lidar com Fibers diretamente. E a RFC at\u00e9 sugere o mesmo:<\/p>\n<blockquote><p><em>Fibers s\u00e3o um recurso avan\u00e7ado que a maioria dos usu\u00e1rios n\u00e3o ir\u00e1 usar diretamente. Este recurso \u00e9 destinado principalmente aos autores de bibliotecas e framework para fornecer um loop de eventos e uma API de programa\u00e7\u00e3o ass\u00edncrona. As Fibers permitem integrar perfeitamente a execu\u00e7\u00e3o ass\u00edncrona de c\u00f3digo em c\u00f3digo s\u00edncrono em qualquer ponto sem a necessidade de modificar a call stack de aplicativo ou adicionar o c\u00f3digo boilerplate.<\/em><\/p>\n<p><em>N\u00e3o se espera que o Fiber API seja usado diretamente no c\u00f3digo em n\u00edvel de aplicativo. Fibers fornecem um API b\u00e1sico de baixo n\u00edvel de controle de fluxo para criar abstra\u00e7\u00f5es de n\u00edvel superior que s\u00e3o ent\u00e3o utilizadas em c\u00f3digo de aplicativo.<\/em><\/p><\/blockquote>\n<p>Considerando seus benef\u00edcios de desempenho, voc\u00ea pode esperar que as bibliotecas e frameworks PHP aproveitem esta nova funcionalidade. Ser\u00e1 interessante ver como elas implementam as Fibers dentro do seu ecossistema.<\/p>\n<h3>Novas propriedades <code>readonly<\/code><\/h3>\n<p>O PHP 8.1 adiciona suporte para propriedades <code>readonly<\/code>. Elas s\u00f3 podem ser inicializadas uma vez a partir do escopo onde s\u00e3o declaradas. Uma vez inicializados, voc\u00ea n\u00e3o pode modificar o valor deles nunca. Fazendo isso, voc\u00ea pode lan\u00e7ar uma exce\u00e7\u00e3o de <strong>erro<\/strong>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/readonly_properties_v2\">RFC<\/a> diz:<\/p>\n<blockquote><p><em>Uma propriedade <strong>readonly <\/strong>s\u00f3 pode ser inicializada uma vez, e apenas a partir do \u00e2mbito onde foi declarada. Qualquer outra atribui\u00e7\u00e3o ou modifica\u00e7\u00e3o da propriedade resultar\u00e1 em uma exce\u00e7\u00e3o de erro.<\/em><\/p><\/blockquote>\n<p>Aqui est\u00e1 um exemplo de como voc\u00ea pode us\u00e1-lo:<\/p>\n<pre><code class=\"language-php\">class Test {\n\u00a0 \u00a0 public readonly string $kinsta;\n \n\u00a0 \u00a0 public function __construct(string $kinsta) {\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Legal initialization.\n\u00a0 \u00a0 \u00a0 \u00a0 $this-&gt;kinsta = $kinsta;\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Uma vez inicializado, n\u00e3o h\u00e1 volta a dar. Ter esta funcionalidade cozinhada em PHP reduz muito o c\u00f3digo boilerplate que \u00e9 frequentemente usada para ativar esta funcionalidade.<\/p>\n<p>A propriedade <code>readonly<\/code> oferece uma forte garantia de imutabilidade, tanto dentro como fora da classe. N\u00e3o importa o c\u00f3digo que corre no meio. Chamando uma propriedade <code>readonly<\/code> ir\u00e1 sempre devolver o mesmo valor.<\/p>\n<p>No entanto, o uso da propriedade <code>readonly<\/code> pode n\u00e3o ser o ideal em casos de uso espec\u00edfico. Por exemplo, voc\u00ea s\u00f3 pode us\u00e1-los ao lado de um <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#typed-properties\">bem digitado<\/a> porque as declara\u00e7\u00f5es sem um tipo s\u00e3o implicitamente <code>null<\/code> e n\u00e3o podem ser <code>readonly<\/code>.<\/p>\n<p>Al\u00e9m disso, definir uma propriedade <code>readonly<\/code> n\u00e3o torna os objetos imut\u00e1veis. A propriedade <code>readonly<\/code> ir\u00e1 segurar o mesmo objeto, mas esse objeto em si pode mudar.<\/p>\n<p>Outra quest\u00e3o menor com esta propriedade \u00e9 que n\u00e3o se pode clon\u00e1-la. J\u00e1 h\u00e1 uma <a href=\"https:\/\/stitcher.io\/blog\/cloning-readonly-properties-in-php-81\">solu\u00e7\u00e3o para este caso de uso em particular<\/a>. Se for necess\u00e1rio, investigue isso.<\/p>\n<h3>Definir constantes de classe <code>final<\/code><\/h3>\n<p>A partir do PHP 8.0, voc\u00ea pode sobrepor constantes de classe com suas child classes. \u00c9 devido \u00e0 forma como a heran\u00e7a \u00e9 implementada no PHP.<\/p>\n<p>Aqui est\u00e1 um exemplo de como voc\u00ea pode anular o valor de uma constante declarada anteriormente:<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n\u00a0 \u00a0 public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n\u00a0 \u00a0 public const M = \"meow\";\n}\u00a0\u00a0<\/code><\/pre>\n<p>Agora, se as vacas querem ficar mais r\u00edgidas com o comportamento dos gatos (pelo menos com constantes), elas podem faz\u00ea-lo com o novo modificador <code>final<\/code> do PHP 8.1.<\/p>\n<p>Uma vez declarada uma constante como <code>final<\/code>, isso significa que.<\/p>\n<pre><code class=\"language-php\">class Moo\n{\n\u00a0 \u00a0 final public const M = \"moo\";\n}\n \nclass Meow extends Moo\n{\n\u00a0 \u00a0 public const M = \"meow\";\n}\n \n\/\/ Fatal error: Meow::M cannot override final constant Moo::M<\/code><\/pre>\n<p>Voc\u00ea pode ler mais sobre isso nas <a href=\"https:\/\/wiki.php.net\/rfc\/final_class_const\">constantes finais da classe<\/a> PHP RFC.<\/p>\n<h3><strong>Novas fun\u00e7\u00f5es<\/strong>\u00a0<code>fsync()<\/code> e\u00a0<code>fdatasync()<\/code><\/h3>\n<p>O PHP 8.1 adiciona duas novas fun\u00e7\u00f5es de sistema de arquivos chamadas <code>fsync()<\/code> e <code>fdatasync()<\/code>. Eles v\u00e3o parecer familiares para aqueles usados para <a href=\"https:\/\/linux.die.net\/man\/2\/fsync\">fun\u00e7\u00f5es Linux com o mesmo nome<\/a>. Isso \u00e9 porque elas s\u00e3o relacionadas, apenas implementadas para o PHP.<\/p>\n<p>Na verdade, esta adi\u00e7\u00e3o j\u00e1 devia ter sido feita h\u00e1 muito tempo. PHP \u00e9 uma das poucas linguagens principais de programa\u00e7\u00e3o que ainda n\u00e3o implementou <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\">fsync() e fdatasync()<\/a> &#8211; ou seja, <a href=\"https:\/\/wiki.php.net\/rfc\/fsync_function\">at\u00e9 o PHP 8.1<\/a>.<\/p>\n<p>A fun\u00e7\u00e3o <code>fsync()<\/code> \u00e9 similar \u00e0 fun\u00e7\u00e3o <code>fflush()<\/code> existente no PHP, mas ela difere significativamente de uma maneira. Enquanto <code>fflush()<\/code> descarrega os buffers internos da aplicativo para o SO, <code>fsync()<\/code> vai um passo al\u00e9m e assegura que os buffers internos sejam descarregados para o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-ssd\/\">armazenamento<\/a> f\u00edsico. Isso garante uma escrita completa e persistente para que voc\u00ea possa recuperar os dados mesmo ap\u00f3s um aplicativo ou falha do sistema.<\/p>\n<p>Aqui est\u00e1 um exemplo de como voc\u00ea pode us\u00e1-lo.<\/p>\n<pre><code class=\"language-php\">$doc = 'kinsta.txt';\n\n$kin = fopen($doc, 'ki');\nfwrite($kin, 'doc info');\nfwrite($kin, \"\\r\\n\");\nfwrite($kin, 'more info');\n\nfsync($kin);\nfclose($kin);<\/code><\/pre>\n<p>Adicionar a chamada <code>fsync()<\/code> no final garante que qualquer dado armazenado no PHP ou no buffer interno do sistema operacional seja gravado no armazenamento. Todas as outras execu\u00e7\u00f5es de c\u00f3digo s\u00e3o bloqueadas at\u00e9 l\u00e1.<\/p>\n<p>Sua fun\u00e7\u00e3o relacionada \u00e9 <code>fdatasync()<\/code>. Use-o para sincronizar dados, mas n\u00e3o necessariamente metadados. Para dados cujos metadados n\u00e3o s\u00e3o essenciais, esta chamada de fun\u00e7\u00e3o torna o processo de escrita um pouco mais r\u00e1pido.<\/p>\n<p>No entanto, voc\u00ea deve notar que o PHP 8.1 ainda n\u00e3o suporta <code>fdatasync()<\/code> totalmente no Windows. Ele simplesmente age como um pseud\u00f4nimo de <code>fsync()<\/code>. No POSIX, <code>fdatasync()<\/code> \u00e9 devidamente implementado.<\/p>\n<h3><strong>Nova fun\u00e7\u00e3o<\/strong>\u00a0<code>array_is_list()<\/code><\/h3>\n<p>As arrays PHP podem conter tanto o integer como as teclas de string. Isso significa que voc\u00ea pode us\u00e1-las para v\u00e1rias coisas, incluindo listas, tabelas de hash, dicion\u00e1rios, cole\u00e7\u00f5es, pilhas, filas, e muito mais. Voc\u00ea pode at\u00e9 mesmo ter arrays dentro de arrays, criando arrays multidimensionais.<\/p>\n<p>Voc\u00ea pode verificar eficientemente se uma determinada entrada \u00e9 um array, mas n\u00e3o \u00e9 t\u00e3o f\u00e1cil verificar se ela tem algum offsets de array em falta, chaves fora de ordem, etc. Em resumo, voc\u00ea n\u00e3o pode verificar rapidamente se um array \u00e9 uma lista.<\/p>\n<p>A <a href=\"https:\/\/wiki.php.net\/rfc\/is_list\">fun\u00e7\u00e3oarray_is_list()<\/a> verifica se as chaves de um array est\u00e3o em ordem sequencial a partir de <code>0<\/code>, e sem lacunas. Se todas as condi\u00e7\u00f5es forem satisfeitas, ela retornar\u00e1 <code>true<\/code>. Por padr\u00e3o, ela tamb\u00e9m retorna <code>true<\/code> para arrays vazios.<\/p>\n<p>Aqui est\u00e3o alguns exemplos de como us\u00e1-lo com condi\u00e7\u00f5es <code>true<\/code> e <code>false<\/code> preenchidas:<\/p>\n<pre><code class=\"language-php\">\/\/ true array_is_list() examples\narray_is_list([]); \/\/ true\narray_is_list([1, 2, 3]); \/\/ true\narray_is_list(['cats', 2, 3]); \/\/ true\narray_is_list(['cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 'dogs']); \/\/ true\narray_is_list([0 =&gt; 'cats', 1 =&gt; 'dogs']); \/\/ true \n\n\/\/ false array_is_list() examples \narray_is_list([1 =&gt; 'cats', 'dogs']); \/\/ as first key isn't 0\narray_is_list([1 =&gt; 'cats', 0 =&gt; 'dogs']); \/\/ keys are out of order\narray_is_list([0 =&gt; 'cats', 'bark' =&gt; 'dogs']); \/\/ non-integer keys\narray_is_list([0 =&gt; 'cats', 2 =&gt; 'dogs']); \/\/ gap in between keys <\/code><\/pre>\n<p>Uma lista de array PHP com chaves fora de ordem \u00e9 <a href=\"https:\/\/kinsta.com\/pt\/blog\/seguranca-wordpres\/#2-use-latest-php-version\">uma fonte potencial de bugs<\/a>. Usar esta fun\u00e7\u00e3o para impor uma estrita ades\u00e3o aos requisitos da <strong>lista <\/strong>antes de avan\u00e7ar com a execu\u00e7\u00e3o do c\u00f3digo \u00e9 uma grande adi\u00e7\u00e3o ao PHP.<\/p>\n<h3>Novas Fun\u00e7\u00f5es Sodium XChaCha20<\/h3>\n<p>O Sodium \u00e9 uma biblioteca criptogr\u00e1fica moderna e f\u00e1cil de usar para criptografia, decodifica\u00e7\u00e3o, hashing de <a href=\"https:\/\/kinsta.com\/pt\/blog\/gerenciadores-de-senhas\/\">senhas<\/a>, assinaturas e muito mais. O <a href=\"https:\/\/pecl.php.net\/package\/libsodium\">pacote PECL libsodium<\/a> adiciona um wrapper para o Sodium para que os desenvolvedores de PHP possam us\u00e1-lo.<\/p>\n<p>Mesmo <a href=\"https:\/\/doc.libsodium.org\/libsodium_users\">empresas l\u00edderes em tecnologia<\/a> como Facebook, Discord, Malwarebytes e Valve usam libsodium para proteger seus usu\u00e1rios com conex\u00f5es r\u00e1pidas e seguras.<\/p>\n<p>libsodium suporta o <a href=\"https:\/\/www.cryptopp.com\/wiki\/XChaCha20\">algoritmo de encripta\u00e7\u00e3o XChaCha20<\/a> para encriptar e desencriptar dados, especialmente para encripta\u00e7\u00e3o de fluxo. Da mesma forma, a extens\u00e3o libsodium da PECL j\u00e1 suporta o XChaCha20, mas apenas com c\u00f3digo de autentica\u00e7\u00e3o de mensagens Poly1305.<\/p>\n<p>Muitas aplica\u00e7\u00f5es PHP usam o XChaCha20 diretamente para criptografia de fluxo. Para facilitar as coisas, come\u00e7ando com o PHP 8.1, voc\u00ea ter\u00e1 tr\u00eas novas fun\u00e7\u00f5es para criptografar ou decodificar dados com o XChaCha20 sem autentica\u00e7\u00e3o envolvida. Este modo \u00e9 chamado de &#8220;modo desconectado&#8221;.<\/p>\n<p>As fun\u00e7\u00f5es do XChaCha20 recentemente introduzidas s\u00e3o:<\/p>\n<ul>\n<li><code>sodium_crypto_stream_xchacha20_keygen<\/code>: Devolve uma chave aleat\u00f3ria segura para uso com sodium_crypto_stream_xchacha20.<\/li>\n<li><code>sodium_crypto_stream_xchacha20<\/code>: Expande o keystream e o nonce para um keystream de bytes pseudorand\u00f4micos.<\/li>\n<li><code>sodium_crypto_stream_xchacha20_xor<\/code>: Criptografa uma mensagem usando uma nonce e uma chave secreta (sem autentica\u00e7\u00e3o).<\/li>\n<\/ul>\n<p>Adicionalmente, existem duas novas constantes PHP definidas no namespace global:<\/p>\n<ul>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES<\/code> (atribu\u00eddo <strong>32<\/strong>)<\/li>\n<li><code>SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES<\/code> (atribu\u00eddo <strong>24<\/strong>)<\/li>\n<\/ul>\n<p>Use-o com cuidado, no entanto. Como \u00e9 sem autentica\u00e7\u00e3o, a opera\u00e7\u00e3o de desencripta\u00e7\u00e3o \u00e9 vulner\u00e1vel a ataques de texto criptografado comuns.<\/p>\n<p>Voc\u00ea pode ler mais sobre seu uso e requisitos na <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6868\">p\u00e1gina do GitHub<\/a>.<\/p>\n<h3>Nova Classe IntlDatePatternGenerator<\/h3>\n<p>A biblioteca subjacente da UTI do PHP suporta a cria\u00e7\u00e3o de <a href=\"https:\/\/kinsta.com\/pt\/blog\/plugin-calendario-wordpress\/\">formatos de data e hora<\/a> localizados, mas n\u00e3o \u00e9 totalmente personaliz\u00e1vel.<\/p>\n<p>Por exemplo, se voc\u00ea quiser criar formatos de dados e hor\u00e1rios espec\u00edficos at\u00e9 o PHP 8.0, voc\u00ea pode usar a <a href=\"https:\/\/www.php.net\/manual\/en\/class.intldateformatter.php\">constante IntlDateFormatter predefinida<\/a> para faz\u00ea-lo de 6 maneiras:<\/p>\n<ul>\n<li><strong><code>IntlDateFormatter::LONG<\/code>:<\/strong> Mais longo, como <strong>10 de novembro de 2017 <\/strong>ou <strong>23:22:33pm<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::MEDIUM<\/code>:<\/strong> Um pouco mais curto, como <strong>10 de novembro de 2017<\/strong><\/li>\n<li><strong><code>IntlDateFormatter::SHORT<\/code>:<\/strong> Apenas num\u00e9rico, como <strong>10\/11\/17 <\/strong>ou <strong>23:22h<\/strong><\/li>\n<\/ul>\n<p>Cada uma delas tamb\u00e9m tem suas pr\u00f3prias variantes <code>RELATIVE_<\/code>, que define a formata\u00e7\u00e3o da data dentro de um intervalo limitado, antes ou depois da data atual. Em PHP, os valores s\u00e3o <strong>yesterday<\/strong>,\u00a0<strong>today<\/strong>, e <strong>tomorrow<\/strong>.<\/p>\n<p>Digamos que voc\u00ea queira usar a vers\u00e3o longa para o ano e a vers\u00e3o curta para o m\u00eas, como <strong>10\/11\/2017<\/strong>. A partir do PHP 8.0, voc\u00ea n\u00e3o pode.<\/p>\n<p>No PHP 8.1+, voc\u00ea pode especificar quais formatos usar para a data, m\u00eas e hora com a nova classe <strong>IntlDatePatternGenerator<\/strong>. Voc\u00ea pode deixar a ordem exata desses componentes para o formatador.<\/p>\n<p>Voc\u00ea deve observar que embora esta classe tenha apenas a palavra <strong>Date<\/strong>, ela \u00e9 consistente com o <strong>DateTimePatternGenerator <\/strong>da UTI. Isso significa que voc\u00ea tamb\u00e9m pode us\u00e1-lo para criar formatos de tempo flex\u00edveis. Para simplificar a nomenclatura, a equipe PHP escolheu o termo mais curto <strong>IntlDatePatternGenerator.<\/strong><\/p>\n<p>Aqui est\u00e1 um exemplo direto do <a href=\"https:\/\/wiki.php.net\/rfc\/intldatetimepatterngenerator\">seu RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$skeleton = \"YYYYMMdd\";\n \n$today = \\DateTimeImmutable::createFromFormat('Y-m-d', '2021-04-24');\n \n$dtpg = new \\IntlDatePatternGenerator(\"de_DE\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton);\necho \"de: \", \\IntlDateFormatter::formatObject($today, $pattern, \"de_DE\"), \"\\n\";\n \n$dtpg = new \\IntlDatePatternGenerator(\"en_US\");\n$pattern = $dtpg-&gt;getBestPattern($skeleton), \"\\n\";\necho \"en: \", \\IntlDateFormatter::formatObject($today, $pattern, \"en_US\"), \"\\n\";\n \n\/*\nde: 24.04.2021\nen: 04\/24\/2021\n*\/<\/code><\/pre>\n<p>No c\u00f3digo acima, a vari\u00e1vel <strong>skeleton<\/strong><strong>\u00a0<\/strong>define os formatos espec\u00edficos de data ou hora a usar. No entanto, o formatador lida com a ordem do resultado final.<\/p>\n<h3>Suporte para o formato de imagem AVIF<\/h3>\n<p>AVIF, ou AV1 Image File Format, \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/tipos-arquivo-imagem\/\">formato de imagem<\/a> relativamente novo, livre de royalties, baseado no formato de codifica\u00e7\u00e3o de v\u00eddeo AV1. Al\u00e9m de oferecer maior compress\u00e3o (e, portanto, tamanhos de arquivo menores), ele tamb\u00e9m suporta v\u00e1rios recursos, como transpar\u00eancia, HDR e muito mais.<\/p>\n<p>O formato AVIF s\u00f3 foi <a href=\"https:\/\/aomediacodec.github.io\/av1-avif\/\">padronizado recentemente<\/a> (8 de junho de 2021). Isso abriu caminho para navegadores, como o Chrome 85+ e Firefox 86+, adicionando suporte a imagens AVIF.<\/p>\n<p>O processamento de imagens do PHP 8.1 e a extens\u00e3o GD adicionam suporte a imagens AVIF.<\/p>\n<p>No entanto, para incluir esta funcionalidade, voc\u00ea precisa compilar a extens\u00e3o GD com suporte AVIF. Voc\u00ea pode fazer isso executando os comandos abaixo.<\/p>\n<p>Para Debian\/Ubuntu:<\/p>\n<pre><code class=\"language-bash\">apt install libavif-dev<\/code><\/pre>\n<p>Para Fedora\/RHEL:<\/p>\n<pre><code class=\"language-bash\">dnf install libavif-devel<\/code><\/pre>\n<p>Isso vai instalar todas as \u00faltimas depend\u00eancias. Em seguida, voc\u00ea pode compilar o suporte AVIF rodando a bandeira <code>--with-avif<\/code> com o script <code>. \/configure<\/code>.<\/p>\n<pre><code class=\"language-bash\">.\/buildconf --force\n.\/configure --enable-gd --with-avif<\/code><\/pre>\n<p>Se voc\u00ea est\u00e1 iniciando um novo ambiente do zero, voc\u00ea tamb\u00e9m pode habilitar outras extens\u00f5es do PHP aqui.<\/p>\n<p>Uma vez instalado, voc\u00ea pode testar se o suporte a AVIF est\u00e1 habilitado executando o seguinte comando no seu terminal PHP:<\/p>\n<pre><code class=\"language-bash\">php -i | grep AVIF<\/code><\/pre>\n<p>Se voc\u00ea instalou o AVIF corretamente, voc\u00ea ver\u00e1 o seguinte resultado:<\/p>\n<pre><code class=\"language-bash\">AVIF Support =&gt; enabled<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode usar a chamada <code>gd_info()<\/code> para obter uma lista de recursos GD, incluindo se a funcionalidade de <strong>suporte AVIF <\/strong>est\u00e1 habilitada.<\/p>\n<p>Esta extens\u00e3o atualizada do PHP 8.1 GD tamb\u00e9m adiciona duas novas fun\u00e7\u00f5es para trabalhar com imagens AVIF: <code>imagecreatefromavif<\/code> e <code>imageavif<\/code>. Eles funcionam de forma similar aos seus equivalentes JPEG e PNG.<\/p>\n<p>A fun\u00e7\u00e3o <code>imagecreatefromavif<\/code> retorna uma inst\u00e2ncia GdImage de uma determinada imagem AVIF. Voc\u00ea pode ent\u00e3o usar esta inst\u00e2ncia para editar ou converter a imagem.<\/p>\n<p>A outra fun\u00e7\u00e3o <code>imageavif<\/code> produz o ficheiro de imagem AVIF. Por exemplo, voc\u00ea pode us\u00e1-lo para converter um JPEG para AVIF:<\/p>\n<pre><code class=\"language-php\">$image = imagecreatefromjpeg('image.jpeg');\nimageavif($image, 'image.avif');<\/code><\/pre>\n<p>Voc\u00ea pode ler mais sobre este novo recurso em <a href=\"https:\/\/github.com\/php\/php-src\/pull\/7026\">sua p\u00e1gina do GitHub<\/a>.<\/p>\n<h3>Nova chave para uploads de diret\u00f3rio <code>$_FILES: full_path<\/code><\/h3>\n<p>O PHP mant\u00e9m um grande n\u00famero de vari\u00e1veis pr\u00e9-definidas para rastrear v\u00e1rias coisas. Uma delas \u00e9 a <a href=\"https:\/\/www.php.net\/manual\/en\/reserved.variables.files.php\">vari\u00e1vel $_FILES<\/a> que cont\u00e9m um array associativo de itens carregados atrav\u00e9s do m\u00e9todo HTTP POST.<\/p>\n<p>A maioria dos navegadores modernos suporta <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/input\/file#htmlattrdefwebkitdirectory_non-standard_inline\">o upload de um diret\u00f3rio inteiro<\/a> com campos de <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-fazer-upload-arquivo-html-wordpress\/\">upload de arquivos HTML<\/a>. Mesmo PHP &lt;8.1 suportava esta funcionalidade, mas com uma grande advert\u00eancia. Voc\u00ea n\u00e3o poderia carregar uma pasta com sua estrutura exata de diret\u00f3rios ou caminhos relativos porque o PHP n\u00e3o passou essa informa\u00e7\u00e3o para o array <code>$_FILES<\/code>.<\/p>\n<p>Isso muda no PHP 8.1 com a adi\u00e7\u00e3o de uma nova chave chamada <code>full_path<\/code> ao array <code>$_FILES<\/code>. Usando esses novos dados, voc\u00ea pode armazenar caminhos relativos ou duplicar a estrutura exata de diret\u00f3rios no servidor.<\/p>\n<p>Voc\u00ea pode testar esta informa\u00e7\u00e3o ao emitir o array <code>$FILES<\/code> usando o comando <code>var_dump($_FILES)<\/code>;.<\/p>\n<p>No entanto, tenha cuidado se estiver a usar esta funcionalidade. Assegure-se de que voc\u00ea se protege contra <a href=\"https:\/\/php.watch\/versions\/8.1\/$_FILES-full-path#security-hardening\">ataques de upload de arquivos padr\u00e3o<\/a>.<\/p>\n<h3>Suporte de descompacta\u00e7\u00e3o de arrays com string chave<\/h3>\n<p>O PHP 7.4 adicionou <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#array-spread-operator\">suporte para desempactar o array<\/a> com o operador de spread array (..<strong>. <\/strong>). Ele age como uma alternativa mais r\u00e1pida ao uso da fun\u00e7\u00e3o <code>array_merge()<\/code>. No entanto, este recurso foi limitado a arrays com chave num\u00e9rica j\u00e1 que desempactar arrays com string chave causou conflitos enquanto mesclou arrays com chaves duplicadas.<\/p>\n<p>No entanto, o PHP 8 adicionou <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#named-arguments\">suporte a argumentos nomeados<\/a>, removendo essa limita\u00e7\u00e3o. Assim, o desempacotamento de array agora tamb\u00e9m suportar\u00e1 arrays com string-keyed usando a mesma sintaxe:<\/p>\n<pre><code class=\"language-php\">$array = [...$array1, ...$array2];<\/code><\/pre>\n<p>Este <a href=\"https:\/\/wiki.php.net\/rfc\/array_unpacking_string_keys\">exemplo de RFC<\/a> ilustra como \u00e9 feita a fus\u00e3o de arrays com chaves de string duplicadas no PHP 8.1:<\/p>\n<pre><code class=\"language-php\">$array1 = [\"a\" =&gt; 1];\n$array2 = [\"a\" =&gt; 2];\n$array = [\"a\" =&gt; 0, ...$array1, ...$array2];\nvar_dump($array); \/\/ [\"a\" =&gt; 2]<\/code><\/pre>\n<p>Aqui, a tecla de string &#8220;a&#8221; aparece tr\u00eas vezes antes da fus\u00e3o via desembalagem de array. Mas apenas o seu \u00faltimo valor pertencente a <code>$array2<\/code> ganha.<\/p>\n<h3>Nota\u00e7\u00e3o num\u00e9rica octal explicita<\/h3>\n<p>O PHP suporta v\u00e1rios sistemas num\u00e9ricos, incluindo decimal (base-10), bin\u00e1rio (base-2), octal (base-8) e hexadecimal (base-16). O sistema de numerais decimais \u00e9 o padr\u00e3o.<\/p>\n<p>Se voc\u00ea quiser usar qualquer outro sistema num\u00e9rico, ent\u00e3o voc\u00ea ter\u00e1 que prefixar cada n\u00famero com um prefixo padr\u00e3o:<\/p>\n<ul>\n<li><strong>Hex:<\/strong> <code>0x<\/code> prefixo. (por exemplo, 17 = <code>0x11<\/code>)<\/li>\n<li><strong>Binary:<\/strong> <code>0b<\/code> prefixo. (por exemplo, 3 = <code>0b11<\/code>)<\/li>\n<li><strong>Octal:<\/strong>\u00a0<code>0<\/code> prefixo. (por exemplo, 9 = <code>011<\/code>)<\/li>\n<\/ul>\n<p>Voc\u00ea pode ver como o prefixo do sistema num\u00e9rico octal varia em rela\u00e7\u00e3o ao resto. Para padronizar esta preocupa\u00e7\u00e3o, muitas linguagens de programa\u00e7\u00e3o est\u00e3o adicionando suporte a uma nota\u00e7\u00e3o expl\u00edcita de numera\u00e7\u00e3o octal: <code>0o<\/code> ou <code>0O<\/code>.<\/p>\n<p>A partir do PHP 8.1, voc\u00ea pode escrever o exemplo mostrado acima (ou seja, o n\u00famero 9 no base-10) no sistema num\u00e9rico octal como <code>0o11<\/code> ou <code>0O11<\/code>.<\/p>\n<pre><code class=\"language-php\">0o16 === 14; \/\/ true\n0o123 === 83; \/\/ true\n \n0O16 === 14; \/\/ true\n0O123 === 83; \/\/ true\n \n016 === 0o16; \/\/ true\n016 === 0O16; \/\/ true<\/code><\/pre>\n<p>Al\u00e9m disso, esta nova funcionalidade tamb\u00e9m funciona com o <a href=\"https:\/\/wiki.php.net\/rfc\/numeric_literal_separator\">separador num\u00e9rico literal de sublinhado <\/a>introduzido no PHP 7.4.<\/p>\n<p>Leia mais sobre esta nova funcionalidade do PHP 8.1 em <a href=\"https:\/\/wiki.php.net\/rfc\/explicit_octal_notation\">sua RFC<\/a>.<\/p>\n<h3>Suporte para algoritmos de MurmurHash3 e xxHash hash<\/h3>\n<p>O PHP 8.1 adiciona suporte para algoritmos de hashing MurmurHash3 e xxHash. Eles n\u00e3o s\u00e3o projetados para uso criptogr\u00e1fico, mas ainda fornecem uma sa\u00edda impressionante de aleatoriedade, dispers\u00e3o e singularidade.<\/p>\n<p>Estes <a href=\"https:\/\/php.watch\/articles\/php-hash-benchmark\">novos algoritmos de hashing s\u00e3o mais r\u00e1pidos<\/a> que a maioria dos algoritmos de hashing existentes no PHP. Na verdade, algumas dessas variantes de algoritmos de hashing s\u00e3o mais r\u00e1pidas do que a taxa de transfer\u00eancia da RAM.<\/p>\n<p>Como o PHP 8.1 tamb\u00e9m adiciona suporte para declarar par\u00e2metros de <code>$options<\/code> espec\u00edficos do algoritmo, voc\u00ea pode fazer o mesmo com esses novos algoritmos. O valor padr\u00e3o deste novo argumento \u00e9 <code>[]<\/code>. Ent\u00e3o, ele n\u00e3o afetar\u00e1 nenhuma de nossas fun\u00e7\u00f5es hash existentes.<\/p>\n<p>Voc\u00ea pode ler mais sobre essas novas funcionalidades do PHP 8.1 em suas p\u00e1ginas do GitHub: <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6059\" target=\"_blank\" rel=\"noopener noreferrer\">MurmurHash3<\/a>,\u00a0<a href=\"https:\/\/php.watch\/versions\/8.1\/xxHash\" target=\"_blank\" rel=\"noopener noreferrer\">xxHash<\/a>,\u00a0<a href=\"https:\/\/github.com\/php\/php-src\/pull\/6400\" target=\"_blank\" rel=\"noopener noreferrer\">Algorithm-specific $options<\/a>.<\/p>\n<h3>Suporte DNS-over-HTTPS (DoH)<\/h3>\n<p>DNS-over-HTTPS (DoH) \u00e9 um protocolo para <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-dns\/\">resolu\u00e7\u00e3o DNS<\/a> atrav\u00e9s do protocolo HTTPS. Usando HTTTPS para criptografar dados entre o cliente e o resolvedor DNS, DoH aumenta a privacidade e seguran\u00e7a do usu\u00e1rio ao prevenir ataques MitM.<\/p>\n<p>Come\u00e7ando com o PHP 8.1, voc\u00ea pode <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6612\">usar a extens\u00e3o Curl para especificar um servidor DoH<\/a>. Ele requer que o PHP seja compilado com as vers\u00f5es <strong>da libcurl <\/strong>7.62+. Isso n\u00e3o \u00e9 um problema para a maioria dos sistemas operacionais populares, incluindo as distros Linux, j\u00e1 que elas frequentemente incluem o Curl 7.68+.<\/p>\n<p>Voc\u00ea pode configurar a URL do servidor DoH especificando a op\u00e7\u00e3o <code>CURLOPT_DOH_URL<\/code>.<\/p>\n<pre><code class=\"language-php\">$doh = curl_init('https:\/\/kinsta.com');\ncurl_setopt($doh, CURLOPT_DOH_URL, 'https:\/\/dns.google\/dns-query');\ncurl_exec($doh);<\/code><\/pre>\n<p>No exemplo acima, n\u00f3s usamos o servidor DNS p\u00fablico do Google. Note tamb\u00e9m o uso de <code>https:\/\/<\/code> em todos os URLs utilizados. Certifique-se de configurar isso perfeitamente, pois n\u00e3o h\u00e1 um servidor DNS padr\u00e3o para o qual cair no Curl.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode escolher entre <a href=\"https:\/\/github.com\/curl\/curl\/wiki\/DNS-over-HTTPS\">uma lista de servidores p\u00fablicos DoH<\/a> inclu\u00eddos na documenta\u00e7\u00e3o do Curl.<\/p>\n<p>Al\u00e9m disso, a <a href=\"https:\/\/curl.se\/libcurl\/c\/CURLOPT_DOH_URL.html\">refer\u00eancia CURLOPT_DOH_URL<\/a> da documenta\u00e7\u00e3o Curl explica como usar seus v\u00e1rios argumentos de forma completa.<\/p>\n<h3>Upload de arquivos a partir de Strings com CURLStringFile<\/h3>\n<p>A extens\u00e3o PHP Curl suporta pedidos <a href=\"https:\/\/kinsta.com\/pt\/blog\/redirecionar-http-para-https\/\">HTTP(S) <\/a>com uploads de arquivos. Ela usa a classe <strong>CURLFile <\/strong>para conseguir isso, que aceita um URI ou um caminho de arquivo, um tipo mime, e o nome final do arquivo.<\/p>\n<p>No entanto, com a classe <strong>CURLFile<\/strong>, voc\u00ea s\u00f3 pode aceitar o caminho do arquivo ou URI, mas n\u00e3o o conte\u00fado do arquivo em si. Nos casos em que voc\u00ea j\u00e1 tinha o arquivo sendo carregado na mem\u00f3ria (por exemplo, imagens processadas, documentos XML, PDFs), voc\u00ea tinha que usar <code>data:\/\/<\/code> URIs com codifica\u00e7\u00e3o Base64.<\/p>\n<p>Mas <strong>a libcurl <\/strong>j\u00e1 suporta uma maneira mais f\u00e1cil de aceitar o conte\u00fado do arquivo. A nova classe <strong>CURLStringFile <\/strong>adiciona suporte precisamente para isso.<\/p>\n<p>Voc\u00ea pode <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6456\">ler a p\u00e1gina do GitHub<\/a> para saber mais sobre como ele \u00e9 implementado no PHP 8.1.<\/p>\n<h3>Nova Constante <code>MYSQLI_REFRESH_REPLICA<\/code><\/h3>\n<p>A extens\u00e3o <strong>mysqli <\/strong>do PHP 8.1 adiciona uma nova constante chamada <code>MYSQLI_REFRESH_REPLICA<\/code>. \u00c9 equivalente \u00e0 constante <code>MYSQLI_REFRESH_SLAVE<\/code> existente.<\/p>\n<p>Esta mudan\u00e7a foi bem-vinda no <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6632\">MySQL 8.0.23<\/a> para abordar a insensibilidade racial no vocabul\u00e1rio t\u00e9cnico (os exemplos mais comuns incluem &#8220;escravo&#8221; e &#8220;mestre&#8221;).<\/p>\n<p>Voc\u00ea deve observar que a constante mais antiga n\u00e3o est\u00e1 sendo removida ou depreciada. Desenvolvedores e aplicativos podem continuar usando-a. Esta nova constante \u00e9 apenas uma op\u00e7\u00e3o para desenvolvedores e empresas que desejam deixar para tr\u00e1s tal terminologia.<\/p>\n<h3>Melhorias de desempenho com Inheritance Cache<\/h3>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/commit\/4b79dba93202ed5640dff317046ce2fdd42e1d82\">Inheritance Cache<\/a> \u00e9 uma nova adi\u00e7\u00e3o ao opcache que elimina o overhead da heran\u00e7a da classe PHP.<\/p>\n<p>As classes PHP s\u00e3o compiladas e armazenadas <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-cache\/\">em cache<\/a> por opcache separadamente. No entanto, elas j\u00e1 est\u00e3o ligadas em tempo de execu\u00e7\u00e3o em cada requisi\u00e7\u00e3o. Este processo pode envolver v\u00e1rias verifica\u00e7\u00f5es de compatibilidade e m\u00e9todos\/propriedades\/constantes de empr\u00e9stimo das classes pai e caracter\u00edsticas.<\/p>\n<p>Como resultado, isso leva um tempo consider\u00e1vel para ser executado, mesmo que o resultado seja o mesmo para cada pedido.<\/p>\n<p>Inheritance Cache liga todas as classes dependentes exclusivas (pai, interfaces, caracter\u00edsticas, tipos de propriedades, m\u00e9todos) e armazena os resultados na mem\u00f3ria compartilhada opcache. Como isso acontece apenas uma vez agora, a heran\u00e7a requer menos instru\u00e7\u00f5es.<\/p>\n<p>Al\u00e9m disso, remove limita\u00e7\u00f5es para classes imut\u00e1veis, tais como constantes n\u00e3o resolvidas, propriedades digitadas e verifica\u00e7\u00f5es de tipo covariantes. Assim, todas as classes armazenadas no opcache s\u00e3o imut\u00e1veis, reduzindo ainda mais o n\u00famero de instru\u00e7\u00f5es necess\u00e1rias.<\/p>\n<p>Em suma, promete benef\u00edcios de desempenho significativos. <a href=\"https:\/\/github.com\/dstogov\">Dimitry Stogov<\/a>, o autor deste patch, descobriu que ele mostrou uma melhoria de 8% na base do programa Symfony &#8220;Ol\u00e1, Mundo! N\u00f3s mal podemos esperar para test\u00e1-lo em nossos seguintes <a href=\"https:\/\/kinsta.com\/pt\/blog\/benchmarks-definitivos-do-php\/\">benchmarks PHP<\/a>.<\/p>\n<h3 id=\"firstclass-callable-syntax\" class=\"has-anchor-hash\">Callable Syntax de Primeira Classe<\/h3>\n<p>O PHP 8.1 adiciona uma Callable Syntax de primeira classe para substituir codifica\u00e7\u00f5es existentes usando strings e arrays. Al\u00e9m de criar um <strong>Closure <\/strong>mais limpo, esta nova sintaxe tamb\u00e9m \u00e9 acess\u00edvel por <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-de-revisao-de-codigo\/\">ferramentas de an\u00e1lise<\/a> est\u00e1tica e respeita o escopo declarado.<\/p>\n<p>Aqui est\u00e3o alguns exemplos tirados <a href=\"https:\/\/wiki.php.net\/rfc\/first_class_callable_syntax\">da RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">$fn = Closure::fromCallable('strlen');\n$fn = strlen(...);\n \n$fn = Closure::fromCallable([$this, 'method']);\n$fn = $this-&gt;method(...)\n \n$fn = Closure::fromCallable([Foo::class, 'method']);\n$fn = Foo::method(...);<\/code><\/pre>\n<p>Aqui, todos os pares de express\u00f5es s\u00e3o equivalentes. A sintaxe do ponto triplo (<strong>&#8230;<\/strong>) \u00e9 semelhante ao argumento desempacotar a sintaxe (<code>...$args<\/code>). Exceto aqui, os argumentos ainda n\u00e3o est\u00e3o preenchidos.<\/p>\n<h2>Mudan\u00e7as no PHP 8.1<\/h2>\n<p>O PHP 8.1 tamb\u00e9m inclui altera\u00e7\u00f5es na sua sintaxe e caracter\u00edsticas existentes. Vamos discuti-las:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"7\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>PHP Interactive Shell requer extens\u00e3o da linha de leitura<\/h3>\n<p>A extens\u00e3o <strong>readline do <\/strong>PHP permite funcionalidades de <a href=\"https:\/\/kinsta.com\/pt\/blog\/usar-ssh\/\">interactive shell<\/a> como navega\u00e7\u00e3o, autocompletar, edi\u00e7\u00e3o e muito mais. Enquanto est\u00e1 descompactado com PHP, n\u00e3o est\u00e1 habilitado por padr\u00e3o.<\/p>\n<p>Voc\u00ea pode acessar a shell interactive PHP usando PHP CLI&#8217;s <code>-a<\/code> op\u00e7\u00e3o de linha de comando:<\/p>\n<pre><code class=\"language-php\">php -a\n\nInteractive shell\n\nphp &gt;\nphp &gt; echo \"Hello\";\nHello\nphp &gt; function test() {\nphp { echo \"Hello\";\nphp { }\nphp &gt; test();\nHello<\/code><\/pre>\n<p>Antes do PHP 8.1, voc\u00ea podia abrir a shell interactive usando PHP CLI mesmo sem a extens\u00e3o <strong>readline <\/strong>habilitada. Como esperado, os recursos interativos da shell n\u00e3o funcionavam, tornando a op\u00e7\u00e3o <code>-a<\/code> sem sentido.<\/p>\n<p>No PHP 8.1 CLI, a shell interativa sai com uma mensagem de erro se voc\u00ea <a href=\"https:\/\/github.com\/php\/php-src\/commit\/959e5787bdf7c088a57dce5f4f7570abd7fe35f8\">n\u00e3o ativou a extens\u00e3o da linha de leitura<\/a>.<\/p>\n<pre><code class=\"language-php\">php -a\nInteractive shell (-a) requires the readline extension.<\/code><\/pre>\n<h3>Modo de erro padr\u00e3o do MySQLi definido para exce\u00e7\u00f5es<\/h3>\n<p>Antes do PHP 8.1, o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mysql\/\">MySQLi<\/a> n\u00e3o tinha o padr\u00e3o para silenciar os erros. Este comportamento muitas vezes levava a um c\u00f3digo que n\u00e3o seguia um tratamento rigoroso de erros\/exce\u00e7\u00f5es. Os desenvolvedores tinham que implementar suas pr\u00f3prias fun\u00e7\u00f5es expl\u00edcitas de tratamento de erros.<\/p>\n<p>O PHP 8.1 altera este comportamento ao definir o modo de relat\u00f3rio de erros padr\u00e3o do MySQLi para lan\u00e7ar uma exce\u00e7\u00e3o.<\/p>\n<pre><code class=\"language-php\">Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...<\/code><\/pre>\n<p>Como esta \u00e9 uma altera\u00e7\u00e3o de ruptura, para vers\u00f5es PHP &lt;8.1, voc\u00ea deve definir explicitamente o modo de tratamento de erros usando a fun\u00e7\u00e3o <code>mysqli_report<\/code> antes de fazer a primeira conex\u00e3o MySQLi. Alternativamente, voc\u00ea pode fazer o mesmo selecionando o valor do relat\u00f3rio de erro instanciando uma inst\u00e2ncia do <code>mysqli_driver<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/mysqli_default_errmode\">A RFC<\/a> segue uma <a href=\"https:\/\/wiki.php.net\/rfc\/pdo_default_errmode\">mudan\u00e7a similar introduzida no PHP 8.0<\/a>.<\/p>\n<h3>Terminais de linha personaliz\u00e1veis para fun\u00e7\u00f5es de escrita CSV<\/h3>\n<p>Antes do PHP 8.1, as fun\u00e7\u00f5es de escrita <a href=\"https:\/\/kinsta.com\/changelog\/export-redirects-csv\/\">CSV<\/a> embutidas do PHP, <code>fputcsv<\/code> e <code>SplFileObject::fputcsv<\/code>, eram codificadas para adicionar <code>\\n<\/code> (ou o caractere Line-Feed) no final de cada linha.<\/p>\n<p>O PHP 8.1 adiciona suporte para um novo par\u00e2metro chamado <code>eol<\/code> a estas fun\u00e7\u00f5es. Voc\u00ea pode us\u00e1-lo para passar um caractere configur\u00e1vel de fim de linha. Por padr\u00e3o, ele ainda usa o caractere <code>\\n<\/code>. Ent\u00e3o, voc\u00ea pode continuar usando-o em seu c\u00f3digo existente.<\/p>\n<p>As regras padr\u00e3o de fuga de caracteres aplicam-se ao uso de caracteres de fim de linha. Se voc\u00ea quiser usar <code>\\r<\/code>, <code>\\n<\/code>, ou <code>\\r\\n<\/code> como caracteres EOL, voc\u00ea deve coloc\u00e1-los entre aspas duplas.<\/p>\n<p>Aqui est\u00e1 <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6403\">a p\u00e1gina do GitHub<\/a> a acompanhar esta nova altera\u00e7\u00e3o.<\/p>\n<h3>Nova restri\u00e7\u00f5es do operador <code>version_compare<\/code><\/h3>\n<p>A fun\u00e7\u00e3o <code>version_compare()<\/code> do PHP compara duas strings de n\u00fameros de vers\u00e3o. Esta fun\u00e7\u00e3o aceita um terceiro argumento opcional chamado <code>operator<\/code> para testar um relacionamento em particular.<\/p>\n<p>Embora n\u00e3o coberto explicitamente na documenta\u00e7\u00e3o, antes do PHP 8.1, voc\u00ea poderia definir este par\u00e2metro para um valor parcial (por exemplo, <code>g<\/code>, <code>l<\/code>, <code>n<\/code>) sem enfrentar um erro.<\/p>\n<p>O PHP 8.1 adiciona restri\u00e7\u00f5es mais r\u00edgidas ao argumento do <code>operator<\/code> da fun\u00e7\u00e3o v<code>ersion_compare()<\/code> para superar esta situa\u00e7\u00e3o. Os \u00fanicos operadores que voc\u00ea pode usar agora s\u00e3o:<\/p>\n<ul>\n<li><strong>==<\/strong>, <strong>=<\/strong>, e <strong>eq<\/strong><\/li>\n<li><strong>!=<\/strong>, <strong>&lt;&gt;<\/strong>, e <strong>ne<\/strong><\/li>\n<li><strong>&gt;<\/strong> e <strong>gt<\/strong><\/li>\n<li><strong>&gt;=<\/strong> e <strong>ge<\/strong><\/li>\n<li><strong>&lt;<\/strong> e <strong>lt<\/strong><\/li>\n<li><strong>&lt;=<\/strong> e <strong>le<\/strong><\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/6510\">Acabaram-se os valores parciais do operador<\/a>.<\/p>\n<h3><strong>Fun\u00e7\u00f5es de codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o HTML agora usam<\/strong>\u00a0<code>ENT_QUOTES | ENT_SUBSTITUTE<\/code><\/h3>\n<p>As entidades HTML s\u00e3o representa\u00e7\u00f5es textuais de caracteres que de outra forma seriam interpretadas como HTML. Pense em caracteres como <code>&lt;<\/code> e <code>&gt;<\/code> usados para <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-praticas-html\/\">definir tags HTML<\/a> (por exemplo <code>&lt;a&gt;<\/code>, <code>&lt;h3&gt;<\/code>, <code>&lt;script&gt;<\/code>).<\/p>\n<p>A entidade HTML para <code>&lt;<\/code> \u00e9 <code>&lt<\/code>; (menor que o s\u00edmbolo) e <code>&gt;<\/code> \u00e9 <code>&gt<\/code>; (maior que o s\u00edmbolo). Voc\u00ea pode usar essas entidades HTML com seguran\u00e7a em um documento HTML sem acionar o mecanismo de renderiza\u00e7\u00e3o do navegador.<\/p>\n<p>Por exemplo, <code>&lt;script&gt;<\/code>\u00a0aparecer\u00e1 como <code>&lt;script&gt;<\/code> no navegador, ao inv\u00e9s de ser interpretado como uma tag HTML.<\/p>\n<p>Antes do PHP 8.1, as fun\u00e7\u00f5es <a href=\"https:\/\/www.php.net\/manual\/function.htmlspecialchars.php\">htmlspecialchars()<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/function.htmlentities.php\">htmlentities()<\/a> convertiam s\u00edmbolos como <code>\"<\/code>, <code>&lt;<\/code> , <code>&gt;<\/code> , e <code>&<\/code> para suas respectivas entidades HTML. Mas eles n\u00e3o converteram o \u00fanico caractere de aspas (<code>'<\/code>) para sua entidade HTML por padr\u00e3o. Al\u00e9m disso, eles retornaram uma string vazia se houvesse um UTF-8 mal-formado no texto.<\/p>\n<p>No PHP 8.1., essas fun\u00e7\u00f5es de codifica\u00e7\u00e3o e decodifica\u00e7\u00e3o HTML (e suas fun\u00e7\u00f5es relacionadas) tamb\u00e9m ir\u00e3o <a href=\"https:\/\/github.com\/php\/php-src\/commit\/50eca61f68815005f3b0f808578cc1ce3b4297f0\">converter caracteres de aspas simples<\/a> para sua entidade HTML por padr\u00e3o.<\/p>\n<p>E se o texto dado tiver caracteres inv\u00e1lidos, as fun\u00e7\u00f5es ir\u00e3o substitu\u00ed-los por um caractere de substitui\u00e7\u00e3o Unicode (\ufffd) em vez de retornar uma string vazia. O PHP 8.1 realiza isso mudando as assinaturas dessas fun\u00e7\u00f5es para <code>ENT_QUOTES | ENT_SUBSTITUTE<\/code> ao inv\u00e9s de <code>ENT_COMPAT<\/code> por padr\u00e3o.<\/p>\n<p>A maioria das frameworks j\u00e1 usa <code>ENT_QUOTES<\/code> como o valor padr\u00e3o da bandeira. Portanto, voc\u00ea n\u00e3o ver\u00e1 muita diferen\u00e7a devido a esta mudan\u00e7a. Entretanto, o novo flag <code>ENT_SUBSTITUTE<\/code> n\u00e3o \u00e9 muito utilizado. O PHP 8.1 ir\u00e1 fazer com que caracteres UTF-8 inv\u00e1lidos sejam substitu\u00eddos pelo caracter \ufffd ao inv\u00e9s de retornar uma string vazia.<\/p>\n<h3>Advert\u00eancia sobre Ilegais\u00a0Function Calls compactas<\/h3>\n<p>A fun\u00e7\u00e3o <code>compact()<\/code> do PHP \u00e9 super \u00fatil. Voc\u00ea pode us\u00e1-la para criar um array com vari\u00e1veis usando seus nomes e valores.<\/p>\n<p>Por exemplo, considere o seguinte c\u00f3digo:<\/p>\n<pre><code class=\"language-php\">$animal = 'Cat';\n$sound = 'Meow';\n$region = 'Istanbul';\ncompact('animal', 'sound', 'region');\n\/\/ ['animal' =&gt; \"Cat\", 'sound' =&gt; \"Meow\", 'region' =&gt; \"Istanbul\"]<\/code><\/pre>\n<p>A <a href=\"https:\/\/www.php.net\/manual\/en\/function.compact.php\">documenta\u00e7\u00e3o da fun\u00e7\u00e3o compacta<\/a> afirma que s\u00f3 aceitar\u00e1 par\u00e2metros de string ou valores de array com valores de string. No entanto, antes do PHP 7.3, quaisquer strings que n\u00e3o sejam definidas seriam silenciosamente ignoradas.<\/p>\n<p>O PHP 7.3 modificou a fun\u00e7\u00e3o <code>compact()<\/code> para vomitar um aviso se voc\u00ea usar vari\u00e1veis indefinidas. <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\">O PHP 8.1 leva-o um passo adiante<\/a> e lan\u00e7a um aviso.<\/p>\n<p>Voc\u00ea pode <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6921\">ler sua p\u00e1gina do GitHub<\/a> para entender como essa mudan\u00e7a veio a ser.<\/p>\n<h3>Novas migra\u00e7\u00f5es de recursos para objetos de classe<\/h3>\n<p>Um dos objetivos do PHP a longo prazo \u00e9 se afastar <a href=\"https:\/\/php.watch\/articles\/resource-object\">dos recursos em dire\u00e7\u00e3o a objetos de classe padr\u00e3o<\/a>.<\/p>\n<p>Devido a raz\u00f5es hist\u00f3ricas, os objetos de recurso s\u00e3o usados extensivamente em aplica\u00e7\u00f5es PHP. Portanto, a migra\u00e7\u00e3o de recursos para objetos de classe precisa ser o menos disruptiva poss\u00edvel. O PHP 8.1 migra cinco desses recursos:<\/p>\n<h4>O recurso <code>file_info<\/code> migrou para os objetos <code>finfo<\/code><\/h4>\n<p>A <a href=\"https:\/\/www.php.net\/manual\/en\/class.finfo.php\">classe finfo <\/a>do PHP oferece uma interface <a href=\"https:\/\/kinsta.com\/pt\/blog\/programacao-orientada-objetos-python\/#what-is-objectoriented-programming-in-python\">orientada a objetos para as <\/a>fun\u00e7\u00f5es <code>fileinfo<\/code>. Entretanto, o uso das fun\u00e7\u00f5es <code>finfo<\/code> retorna objetos de <code>resource<\/code> com o tipo <code>file_info<\/code> em vez de uma inst\u00e2ncia da pr\u00f3pria classe <code>finfo<\/code>.<\/p>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/pull\/5987\">O PHP 8.1 corrige esta anomalia<\/a>.<\/p>\n<h4>Os recursos do IMAP foram migrados para os objetos de classe <code>IMAP\\Connection<\/code><\/h4>\n<p>Em linha com o objetivo de migra\u00e7\u00e3o recurso-a-objeto, a nova classe <code>IMAP\\Connection<\/code> minimiza potenciais mudan\u00e7as de ruptura quando o PHP eventualmente modifica os detalhes de implementa\u00e7\u00e3o da classe.<\/p>\n<p>Esta nova turma tamb\u00e9m \u00e9 declarada <code>final<\/code>, por isso n\u00e3o \u00e9 permitido <code>extend<\/code>-la.<\/p>\n<p>Leia mais sobre sua implementa\u00e7\u00e3o em <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6418\">sua p\u00e1gina do GitHub<\/a>.<\/p>\n<h4>Os recursos de conex\u00e3o FTP s\u00e3o agora objetos de classe <code>FTP\\Connection<\/code><\/h4>\n<p>No PHP &lt;8.1, se voc\u00ea criar uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-clientes-ftp\/\">conex\u00e3o FTP<\/a> com as fun\u00e7\u00f5es <code>ftp_connect()<\/code> ou <code>ftp_ssl_connect()<\/code>, voc\u00ea receber\u00e1 de volta um objeto de <strong>resource<\/strong>\u00a0do tipo <strong>ftp<\/strong>.<\/p>\n<p>PHP 8.1 adiciona a nova classe <code>FTP\\Connection<\/code> para rectificar isso. E tal como com a classe <code>IMAP\\Connection<\/code>, tamb\u00e9m \u00e9 declarada <code>final<\/code> para evitar que seja estendida.<\/p>\n<p>Leia mais sobre <a href=\"https:\/\/github.com\/php\/php-src\/commit\/b4503fbf882e490f16d85915e83173bd1e414e84\">sua implementa\u00e7\u00e3o<\/a> em sua p\u00e1gina do GitHub.<\/p>\n<h4>Os identificadores das fontes foram migrados para os objetos da classe <code>GdFont<\/code><\/h4>\n<p>A extens\u00e3o GD do PHP fornece a <a href=\"https:\/\/www.php.net\/manual\/en\/function.imageloadfont.php\">fun\u00e7\u00e3o imageloadfont<\/a> (para carregar um bitmap definido pelo usu\u00e1rio e retornar seu ID de recurso identificador de fonte (um inteiro).<\/p>\n<p>No PHP 8.1, esta fun\u00e7\u00e3o ir\u00e1 retornar uma inst\u00e2ncia da classe <strong>GdFont. <\/strong>Al\u00e9m disso, para fazer a migra\u00e7\u00e3o sem problemas, todas as fun\u00e7\u00f5es que anteriormente aceitavam um ID de recurso do <code>imageloadfont()<\/code> agora pegar\u00e3o os novos objetos da classe <strong>GdFont.<\/strong><\/p>\n<p>Leia mais sobre esta migra\u00e7\u00e3o em <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bc40bce868e208fa2d7af950845759d3ef498b5d\">sua p\u00e1gina do GitHub<\/a>.<\/p>\n<h4>Recursos LDAP migrados para Objetos<\/h4>\n<p>O <a href=\"https:\/\/www.php.net\/manual\/en\/intro.ldap.php\">LDAP<\/a>, ou Lightweight Directory Access Protocol, \u00e9 usado para acessar &#8220;Servidores de Diret\u00f3rio&#8221;. Tal como uma estrutura de diret\u00f3rio do disco r\u00edgido, \u00e9 uma base de dados \u00fanica que cont\u00e9m dados numa estrutura em \u00e1rvore.<\/p>\n<p>O PHP inclui uma extens\u00e3o LDAP que aceita ou devolve objetos de<strong> resource <\/strong>antes do PHP 8.1. No entanto, todos eles migraram sem problemas para novas inst\u00e2ncias de classe agora. Os tipos de <strong>resource<\/strong><strong>s <\/strong>que foram transicionados s\u00e3o:<\/p>\n<ul>\n<li><code>ldap link<\/code> recurso para o objeto de classe <code>\\LDAP\\Connection<\/code><\/li>\n<li><code>ldap result<\/code> recurso para o objeto de classe <code>\\LDAP\\Result<\/code><\/li>\n<li><code>ldap result entry<\/code> recurso para o objeto de classe <code>\\LDAP\\ResultEntry<\/code><\/li>\n<\/ul>\n<p>V\u00e1 atrav\u00e9s da <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6770\">sua p\u00e1gina do GitHub<\/a> para entender melhor esta migra\u00e7\u00e3o.<\/p>\n<h4>Recursos ortogr\u00e1ficos s\u00e3o agora objetos de classe<\/h4>\n<p>A <a href=\"https:\/\/www.php.net\/manual\/en\/intro.pspell.php\">extens\u00e3o PHP Pspell<\/a> permite que voc\u00ea verifique ortografias e sugest\u00f5es de palavras.<\/p>\n<p>PHP &lt;8.1 usou <code>pspell<\/code> e\u00a0<code>pspell config<\/code> tipos de objetos de recursos com um identificador inteiro. Estes dois objetos de recurso s\u00e3o agora substitu\u00eddos por objetos de classe <code>PSpell\\Dictionary<\/code> e\u00a0<code>PSpell\\Config<\/code> .<\/p>\n<p>Como migra\u00e7\u00f5es anteriores, <a href=\"https:\/\/php.watch\/versions\/8.1\/PSpell-resource#PSpell-Dictionary\">todas as fun\u00e7\u00f5es Pspell<\/a> que anteriormente aceitavam ou devolviam identificadores de objetos de recurso tomar\u00e3o as novas inst\u00e2ncias de objetos de classe.<\/p>\n<p>Consulte a <a href=\"https:\/\/github.com\/php\/php-src\/commit\/bd12c94f46438dad03d1d3c02fff37b9b950ae6f\">p\u00e1gina do GitHub<\/a> para obter mais informa\u00e7\u00f5es.<\/p>\n<h2>Deprecia\u00e7\u00f5es no PHP 8.1<\/h2>\n<p>O PHP 8.1 deprecia muitas de suas funcionalidades anteriores. A lista seguinte fornece uma breve vis\u00e3o geral das funcionalidades que o PHP 8.1 deprecia:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"10\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>N\u00e3o pode passar de par\u00e2metros de fun\u00e7\u00e3o <code>null<\/code> para non-nulled<\/h3>\n<p>A partir do PHP 8.0, suas fun\u00e7\u00f5es internas aceitam silenciosamente valores <code>null<\/code> mesmo para argumentos n\u00e3o-nulos. O mesmo n\u00e3o se aplica \u00e0s fun\u00e7\u00f5es definidas pelo usu\u00e1rio &#8211; elas s\u00f3 aceitam valores <code>null<\/code> para argumentos n\u00e3o nulos.<\/p>\n<p>Por exemplo, considere este uso:<\/p>\n<pre><code class=\"language-php\">var_dump(<strong>str_contains<\/strong>(\"foobar\", null));\n\/\/ bool(<strong>true<\/strong>)<\/code><\/pre>\n<p>Aqui, o valor <code>null<\/code> \u00e9 silenciosamente convertido para uma string vazia. Assim, o resultado retorna <code>true<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/deprecate_null_to_scalar_internal_arg\">Esta RFC<\/a> visa sincronizar o comportamento das fun\u00e7\u00f5es internas lan\u00e7ando um aviso de deprecia\u00e7\u00e3o no PHP 8.1.<\/p>\n<pre><code class=\"language-php\">var_dump(str_contains(\"foobar\", null));\n\/\/ Deprecated: Passing null to argument of type string is deprecated<\/code><\/pre>\n<p>A deprecia\u00e7\u00e3o se tornar\u00e1 um TypeError na pr\u00f3xima grande vers\u00e3o do PHP (ou seja, PHP &gt;=9.0), tornando o comportamento das fun\u00e7\u00f5es internas consistente com as fun\u00e7\u00f5es definidas pelo usu\u00e1rio.<\/p>\n<h3><strong>Uso restrito de<\/strong>\u00a0<code>$GLOBALS<\/code><\/h3>\n<p>A vari\u00e1vel <code>$GLOBALS<\/code> do PHP fornece uma refer\u00eancia direta \u00e0 sua tabela de s\u00edmbolos internos. O suporte a esta funcionalidade \u00e9 complexo e afeta o desempenho das opera\u00e7\u00f5es de array. Al\u00e9m disso, ela foi raramente utilizada.<\/p>\n<p>De acordo com <a href=\"https:\/\/wiki.php.net\/rfc\/restrict_globals_usage\">a RFC<\/a>, a modifica\u00e7\u00e3o indireta de <code>$GLOBALS<\/code> n\u00e3o \u00e9 mais permitida. Esta altera\u00e7\u00e3o \u00e9 retrocompat\u00edvel.<\/p>\n<p>O impacto desta mudan\u00e7a \u00e9 relativamente baixo:<\/p>\n<blockquote><p><em>Nos pacotes de compositores 2k encontrei <\/em><a href=\"https:\/\/gist.github.com\/nikic\/9fd95866f9811b349b947f63214ad7a9\"><em>23 caixas que usam $GLOBALS<\/em><\/a> <em>sem desreferenci\u00e1-los diretamente. Baseado em uma inspe\u00e7\u00e3o superficial, existem apenas dois casos em que <strong>o $GLOBALS <\/strong>n\u00e3o \u00e9 utilizado de forma somente leitura.<\/em><\/p><\/blockquote>\n<p>Entretanto, o uso de <code>$GLOBALS<\/code> apenas para leitura continua a funcionar como de costume. O que n\u00e3o \u00e9 mais suportado \u00e9 escrever para o <code>$GLOBALS<\/code> como um todo. Como resultado, voc\u00ea pode esperar um ligeiro <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-teste-desempenho\/\">aumento de desempenho<\/a>, especialmente quando se trabalha com arrays PHP comuns.<\/p>\n<h3>Declara\u00e7\u00f5es do tipo retorno para fun\u00e7\u00f5es internas<\/h3>\n<p>O PHP 8.0 permitiu que os desenvolvedores declarassem par\u00e2metros e tipos de retorno para a maioria das fun\u00e7\u00f5es e m\u00e9todos internos. Isso foi poss\u00edvel gra\u00e7as a v\u00e1rias RFCs, como <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#type-errors-internal-functions\">erros de tipo consistentes para fun\u00e7\u00f5es internas<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#union-types-2-0\">Union Types 2.0<\/a>, e <a href=\"https:\/\/wiki.php.net\/rfc\/mixed_type_v2\">Mixed Type v2<\/a>.<\/p>\n<p>No entanto, h\u00e1 muitos casos em que a informa\u00e7\u00e3o do tipo pode estar faltando. Alguns deles incluem um tipo com recursos, par\u00e2metros de passagem por reflexo, tipo de retorno de m\u00e9todos n\u00e3o-final e fun\u00e7\u00f5es ou m\u00e9todos que n\u00e3o analisam par\u00e2metros de acordo com as regras gerais. Voc\u00ea pode ler os detalhes exatos em <a href=\"https:\/\/wiki.php.net\/rfc\/internal_method_return_types\">sua RFC<\/a>.<\/p>\n<p>Esta RFC s\u00f3 aborda o problema com o tipo de retorno de m\u00e9todos n\u00e3o-final. No entanto, ao inv\u00e9s de elimin\u00e1-la imediatamente, a equipe PHP fornece um caminho de migra\u00e7\u00e3o gradual para atualizar suas bases de c\u00f3digo com os tipos de retorno dos m\u00e9todos relevantes.<\/p>\n<p><em>Tipos de retorno de m\u00e9todo interno n\u00e3o-final &#8211; quando poss\u00edvel &#8211; s\u00e3o declarados provisoriamente no PHP 8.1, e eles ser\u00e3o aplicados no PHP 9.0. Isso significa que nas vers\u00f5es do PHP 8.x, um aviso &#8220;depreciado&#8221; \u00e9 levantado durante verifica\u00e7\u00f5es de heran\u00e7a quando um m\u00e9todo interno \u00e9 sobreposto de uma forma que os tipos de retorno s\u00e3o incompat\u00edveis, e o PHP 9.0 tornar\u00e1 esses tipos um erro fatal.<\/em><\/p>\n<p>Se voc\u00ea vir este aviso de deprecia\u00e7\u00e3o ap\u00f3s a atualiza\u00e7\u00e3o para o PHP 8.1, certifique-se de atualizar os tipos de retorno dos seus m\u00e9todos.<\/p>\n<h3>Interface serializ\u00e1vel depreci\u00e1vel<\/h3>\n<p>O PHP 7.4 introduziu o <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#serialization\">mecanismo de objetos <\/a><a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#serialization\">serializ\u00e1velde <\/a><a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#serialization\"> personalizados<\/a> com dois novos m\u00e9todos m\u00e1gicos: <code>__serialize()<\/code> e <code>__unserialize()<\/code>. Estes novos m\u00e9todos visam substituir a interface <strong>Serializable<\/strong>\u00a0quebrada eventualmente.<\/p>\n<p>Este <a href=\"https:\/\/wiki.php.net\/rfc\/phase_out_serializable\">RFC prop\u00f5e<\/a> finalizar essa decis\u00e3o, estabelecendo um plano para a eventual remo\u00e7\u00e3o do <strong>Serializable<\/strong>.<\/p>\n<p>No PHP 8.1, se voc\u00ea implementar a interface <strong>Serializable<\/strong>\u00a0sem implementar os m\u00e9todos <code>__serialize()<\/code> e <code>__unserialize()<\/code>, o PHP ir\u00e1 lan\u00e7ar um aviso de &#8220;Deprecated&#8221;.<\/p>\n<pre><code class=\"language-php\">Deprecated: The Serializable interface is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in ... on line ...<\/code><\/pre>\n<p>Se voc\u00ea est\u00e1 suportando <strong>PHP &lt;7.4 <\/strong>e <strong>PHP &gt;=7.4<\/strong>, voc\u00ea deve implementar tanto a interface <strong>Serializ\u00e1vel <\/strong>quanto os novos m\u00e9todos m\u00e1gicos. Nas vers\u00f5es <strong>PHP &gt;=7.4<\/strong>, os m\u00e9todos m\u00e1gicos ter\u00e3o preced\u00eancia.<\/p>\n<h3>Convers\u00f5es depreciadas n\u00e3o compat\u00edveis do <code style=\"font-size: 1.25rem\">Float<\/code><span style=\"font-size: 1.25rem\"> para <\/span><code style=\"font-size: 1.25rem\">int<\/code><\/h3>\n<p>PHP \u00e9 uma linguagem dinamicamente tipada. Como tal, h\u00e1 muitos casos em que a coer\u00e7\u00e3o do tipo ocorre naturalmente. A maioria dessas coerci\u00f5es s\u00e3o inofensivas e super convenientes.<\/p>\n<p>Entretanto, quando um n\u00famero de <strong>float<\/strong>\u00a0\u00e9 convertido em um <strong>integer<\/strong>, muitas vezes envolve perda de dados. Por exemplo, quando a margem de flutua\u00e7\u00e3o <strong>3.14 <\/strong>\u00e9 convertida em um integer <strong>3<\/strong>, ela perde seu valor fracion\u00e1rio.<\/p>\n<p>O mesmo acontece quando o float est\u00e1 fora da faixa inteira da plataforma, ou quando uma seq\u00fc\u00eancia de floats \u00e9 convertida em um integer .<\/p>\n<p>O PHP 8.1 retifica este comportamento e traz seu tipo din\u00e2mico coercing mais alinhado com a maioria das linguagens de programa\u00e7\u00e3o modernas. O objetivo \u00e9 tornar tais coerc\u00f5es previs\u00edveis e intuitivas.<\/p>\n<p>No PHP 8.1, voc\u00ea ver\u00e1 um aviso de deprecia\u00e7\u00e3o quando um <strong>float<\/strong> n\u00e3o compat\u00edvel \u00e9 implicitamente coagido a uma <strong>int<\/strong>. Mas o que constitui uma flutua\u00e7\u00e3o n\u00e3o compat\u00edvel com um integer ? <a href=\"https:\/\/wiki.php.net\/rfc\/implicit-float-int-deprecate\">A RFC<\/a> responde a isto:<\/p>\n<p><em>Diz-se que um float \u00e9 compat\u00edvel com um integer se possuir as seguintes caracter\u00edsticas:<\/em><\/p>\n<ul>\n<li><em>\u00c9 um n\u00famero (ou seja, n\u00e3o NaN ou Infinity)<\/em><\/li>\n<li><em>Est\u00e1 no alcance de um integer PHP (dependente da plataforma)<\/em><\/li>\n<li><em>N\u00e3o tem parte fracion\u00e1ria<\/em><\/li>\n<\/ul>\n<p>Este aviso de deprecia\u00e7\u00e3o ir\u00e1 actualizar para um <strong>TypeError <\/strong>na pr\u00f3xima vers\u00e3o principal do PHP (i.e. PHP 9.0).<\/p>\n<h3><strong>Os m\u00e9todos <\/strong><code>mysqli::get_client_info<\/code><strong>e <\/strong><code>mysqli_get_client_info($param)<\/code> <strong>s\u00e3o depreciados\u00a0<\/strong><\/h3>\n<p>A API do cliente MySQL define duas constantes: <code>client_info<\/code> (uma string) e <code>client_version<\/code> (uma int). O MySQL Native Driver (MySQLnd) faz parte da fonte PHP oficial e associa estas constantes \u00e0 vers\u00e3o PHP. Na libmysql, elas representam a vers\u00e3o da biblioteca cliente no momento da compila\u00e7\u00e3o.<\/p>\n<p>Antes do PHP 8.1, mysqli expunha estas constantes de 4 maneiras: <code>mysqli_driver<\/code> properties, <code>mysqli <strong>properties<\/strong><\/code>, <code>mysqli_get_client_info()<\/code> function, e <code>mysqli::get_client_info<\/code> method. No entanto, n\u00e3o h\u00e1 m\u00e9todo para <code>client_version<\/code>.<\/p>\n<p>MySQLnd exp\u00f5e estas constantes de 2 maneiras ao PHP: uma constante e uma chamada de fun\u00e7\u00e3o. Para unificar os m\u00e9todos de acesso mysqli com estas duas mesmas op\u00e7\u00f5es, o PHP 8.1 est\u00e1 depreciando estas outras duas op\u00e7\u00f5es:<\/p>\n<ul>\n<li><code>get_client_info<\/code> m\u00e9todo na classe <strong>mysqli<\/strong>. Em vez disso, voc\u00ea pode simplesmente usar a fun\u00e7\u00e3o <code>mysqli_get_client_info()<\/code>.<\/li>\n<li><code>mysqli_get_client_info()<\/code> com par\u00e2metros. Chame a fun\u00e7\u00e3o sem nenhum par\u00e2metro para evitar o aviso de deprecia\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Leia mais sobre esta desvaloriza\u00e7\u00e3o em <a href=\"https:\/\/github.com\/php\/php-src\/pull\/6777\">sua p\u00e1gina do GitHub<\/a>.<\/p>\n<h3>Todas as fun\u00e7\u00f5es <code>mhash*()<\/code>(extens\u00e3o hash) s\u00e3o depreciadas<\/h3>\n<p>O PHP 5.3 integra fun\u00e7\u00f5es <code>mhash*()<\/code> em <code>ext\/hash<\/code> como uma camada de compatibilidade para <code>ext\/mhash<\/code>. Mais tarde, o PHP 7.0 removeu o <code>ext\/mhash<\/code>.<\/p>\n<p>Ao contr\u00e1rio das fun\u00e7\u00f5es <code>hash_*()<\/code>, as fun\u00e7\u00f5es <code>mhash*()<\/code> nem sempre est\u00e3o dispon\u00edveis. Voc\u00ea tem que habilit\u00e1-las separadamente enquanto configura o PHP.<\/p>\n<p>No PHP 7.4, a extens\u00e3o hash foi empacotada junto com o PHP, tornando-a uma extens\u00e3o padr\u00e3o para o PHP. Entretanto, ela ainda suportava a op\u00e7\u00e3o <code>--enable-mhash<\/code> por raz\u00f5es de compatibilidade.<\/p>\n<p>A equipe PHP decidiu <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#mhash_function_family\">depreciar as fun\u00e7\u00f5es mhash*()<\/a> no PHP 8.1, e remov\u00ea-las completamente no PHP 9.0. As fun\u00e7\u00f5es depreciadas s\u00e3o <code>mhash()<\/code>, <code>mhash_keygen_s2k()<\/code>, <code>mhash_count()<\/code>, <code>mhash_get_block_size()<\/code> e <code>mhash_get_hash_name()<\/code>. Voc\u00ea pode usar a funcionalidade padr\u00e3o <code>ext\/hash<\/code> no lugar deles.<\/p>\n<h3>Os par\u00e2metros\u00a0<code>filter.default<\/code> e <code>filter.default_options<\/code> s\u00e3o depreciadosd<\/h3>\n<p>As configura\u00e7\u00f5es padr\u00e3o do PHP <code>filter.default<\/code> INI permitem que voc\u00ea aplique um filtro a todos os super-globais do PHP &#8211; ou seja, dados GPCRS (<code>$_GET<\/code>, <code>$_POST<\/code>, <code>$_COOKIE<\/code>, <code>$_REQUEST<\/code>, e <code>$_SERVER<\/code>).<\/p>\n<p>Por exemplo, voc\u00ea pode definir <code>filter.default=magic_quotes<\/code> ou f<code>ilter.default=add_slashes<\/code> (baseado na vers\u00e3o do PHP) para ressuscitar o recurso de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magic_quotes\">cita\u00e7\u00f5es m\u00e1gicas controversas e inseguras<\/a> do PHP (removido no PHP 5.4).<\/p>\n<p>A configura\u00e7\u00e3o padr\u00e3o do <code>filter.default<\/code> INI fornece funcionalidade adicional, permitindo muitos mais filtros, tornando-o ainda pior. Por exemplo, sua outra op\u00e7\u00e3o &#8211; <code>filter.default=special_chars<\/code> &#8211; permite cita\u00e7\u00f5es m\u00e1gicas apenas para HTML. H\u00e1 muito menos consci\u00eancia destas configura\u00e7\u00f5es.<\/p>\n<p>O PHP 8.1 ir\u00e1 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1#filterdefault_ini_setting\">lan\u00e7ar um aviso de deprecia\u00e7\u00e3o<\/a> se o <code>filter.default<\/code> estiver definido para qualquer valor diferente de <code>unsafe_raw<\/code> (o padr\u00e3o). Voc\u00ea n\u00e3o ver\u00e1 um aviso de deprecia\u00e7\u00e3o separado para f<code>ilter.default_options<\/code>, mas o PHP 9.0 remover\u00e1 essas duas configura\u00e7\u00f5es INI.<\/p>\n<p>Como alternativa, voc\u00ea pode come\u00e7ar a usar a fun\u00e7\u00e3o <a href=\"https:\/\/www.php.net\/manual\/en\/function.filter-var.php\">filter_var().<\/a> Ela filtra vari\u00e1veis com o filtro especificado.<\/p>\n<h3><strong>Depreciar a <\/strong><code>autovivification<\/code> <strong>em falso<\/strong><\/h3>\n<p>O PHP permite a autocria\u00e7\u00e3o (autocria\u00e7\u00e3o de arrays\u00a0a partir de valores falsos). Esta caracter\u00edstica \u00e9 super \u00fatil se a vari\u00e1vel \u00e9 indefinida.<\/p>\n<p>No entanto, n\u00e3o \u00e9 ideal criar automaticamente um array quando o valor \u00e9 falso ou nulo.<\/p>\n<p>Este <a href=\"https:\/\/wiki.php.net\/rfc\/autovivification_false\">RFC desabilita a autovivifica\u00e7\u00e3o<\/a> a partir de valores falsos. Entretanto, note que a autovivifica\u00e7\u00e3o a partir de vari\u00e1veis indefinidas e nulas ainda \u00e9 permitida.<\/p>\n<p>No PHP 8.1, anexando a uma vari\u00e1vel do tipo false ir\u00e1 emitir um aviso de deprecia\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-php\">Deprecated: Automatic conversion of false to array is deprecated in<\/code><\/pre>\n<p>O PHP 9.0 vai lan\u00e7ar um erro fatal para o mesmo, que \u00e9 id\u00eantico a outros tipos escalares.<\/p>\n<h3>A propriedade <code>mysqli_driver-&gt;driver_version<\/code> \u00e9 depreciada<\/h3>\n<p>A propriedade <strong>mysqli_driver-&gt;driver_version <\/strong>da extens\u00e3o MySQLi n\u00e3o \u00e9 atualizada h\u00e1 13 anos. Apesar de muitas mudan\u00e7as no driver desde ent\u00e3o, ele ainda retorna o valor da vers\u00e3o antiga do driver, tornando esta propriedade sem sentido.<\/p>\n<p>No PHP 8.1, a <a href=\"https:\/\/github.com\/php\/php-src\/commit\/3dfd3558ca2f63f\">propriedade mysqli_driver-&gt;driver_version \u00e9 depreciada<\/a>.<\/p>\n<h2>Outras altera\u00e7\u00f5es menores<\/h2>\n<p>H\u00e1 <a href=\"https:\/\/wiki.php.net\/rfc\/deprecations_php_8_1\">muito mais deprecia\u00e7\u00f5es no PHP 8.1<\/a>. Listar todas elas aqui ser\u00e1 um exerc\u00edcio exaustivo. N\u00f3s recomendamos que voc\u00ea verifique diretamente a RFC para estas pequenas deprecia\u00e7\u00f5es.4<\/p>\n<p>A p\u00e1gina GitHub do PHP tamb\u00e9m inclui um guia <a href=\"https:\/\/github.com\/php\/php-src\/blob\/master\/UPGRADING\">PHP 8.1 UPGRADE NOTES.<\/a> Ele lista todas as mudan\u00e7as que voc\u00ea deve considerar antes de atualizar para o PHP 8.1.<\/p>\n\n<h2>Resumo<\/h2>\n<p>O PHP 8.1 \u00e9 melhor que o <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\">seu antecessor<\/a>, o que n\u00e3o \u00e9 uma pequena proeza. Achamos que as funcionalidades mais interessantes do PHP 8.1 s\u00e3o Enums, Fibers, Pure Intersection Types, e suas muitas melhorias de desempenho. Al\u00e9m disso, mal podemos esperar para colocar o PHP 8.1 atrav\u00e9s de seus ritmos e comparar v\u00e1rias <a href=\"https:\/\/kinsta.com\/pt\/blog\/frameworks-php-populares\/\">frameworks PHP<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/wordpress-quota-mercado\/\">CMSs<\/a>.<\/p>\n<p>Certifique-se de marcar este artigo no blog para sua refer\u00eancia futura.<\/p>\n<p><em>Qual PHP 8.1 \u00e9 o seu recurso favorito? Compartilhe suas id\u00e9ias com a comunidade na se\u00e7\u00e3o de coment\u00e1rios abaixo.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lan\u00e7ado em 25 de novembro de 2021, o PHP 8.1 est\u00e1 finalmente aqui, repleto de v\u00e1rias funcionalidades interessantes. Neste artigo, vamos cobrir em detalhes o que &#8230;<\/p>\n","protected":false},"author":117,"featured_media":44041,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[32,525],"topic":[998],"class_list":["post-44036","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-php-8-1","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.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais<\/title>\n<meta name=\"description\" content=\"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!\" \/>\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-1\/\" \/>\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.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais\" \/>\n<meta property=\"og:description\" content=\"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\" \/>\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=\"2021-09-02T09:01:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-26T13:49:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.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=\"37 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-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais\",\"datePublished\":\"2021-09-02T09:01:12+00:00\",\"dateModified\":\"2025-02-26T13:49:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\"},\"wordCount\":8226,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png\",\"keywords\":[\"php\",\"php 8.1\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\",\"name\":\"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png\",\"datePublished\":\"2021-09-02T09:01:12+00:00\",\"dateModified\":\"2025-02-26T13:49:25+00:00\",\"description\":\"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png\",\"width\":1460,\"height\":730,\"caption\":\"php-8.1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#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.1: Recursos, Mudan\u00e7as, Melhorias 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.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais","description":"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!","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-1\/","og_locale":"pt_PT","og_type":"article","og_title":"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais","og_description":"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!","og_url":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2021-09-02T09:01:12+00:00","article_modified_time":"2025-02-26T13:49:25+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Salman Ravoof","Tempo estimado de leitura":"37 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais","datePublished":"2021-09-02T09:01:12+00:00","dateModified":"2025-02-26T13:49:25+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/"},"wordCount":8226,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","keywords":["php","php 8.1"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/","url":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/","name":"O Que H\u00e1 de Novo no PHP 8.1: Recursos, Mudan\u00e7as, Melhorias e Muito Mais","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","datePublished":"2021-09-02T09:01:12+00:00","dateModified":"2025-02-26T13:49:25+00:00","description":"Explore o que h\u00e1 de novo no PHP 8.1. Das novas funcionalidades e melhorias de performance do PHP 8.1 \u00e0s mudan\u00e7as e deprecia\u00e7\u00f5es, n\u00f3s cobrimos todas elas!","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/php-8-1\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2021\/09\/php-8.1-.png","width":1460,"height":730,"caption":"php-8.1"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8-1\/#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.1: Recursos, Mudan\u00e7as, Melhorias 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\/44036","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=44036"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/44036\/revisions"}],"predecessor-version":[{"id":47588,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/44036\/revisions\/47588"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/it"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/es"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/translations\/nl"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/44036\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/44041"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=44036"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=44036"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=44036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}