{"id":37383,"date":"2020-05-26T07:01:56","date_gmt":"2020-05-26T14:01:56","guid":{"rendered":"https:\/\/kinsta.com\/?p=73118"},"modified":"2023-09-05T05:14:17","modified_gmt":"2023-09-05T08:14:17","slug":"php-8","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/php-8\/","title":{"rendered":"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)"},"content":{"rendered":"<p>O PHP 8 foi oficialmente lan\u00e7ado para o General Availability em 26 de novembro de 2020!<\/p>\n<p>Esta nova grande atualiza\u00e7\u00e3o traz muitas otimiza\u00e7\u00f5es e funcionalidades poderosas para linguagem. Estamos empolgados para gui\u00e1-lo atrav\u00e9s das mudan\u00e7as mais interessantes que nos permitir\u00e3o escrever melhor c\u00f3digo e construir aplicativos mais robustos.<\/p>\n<figure id=\"attachment_84636\" aria-describedby=\"caption-attachment-84636\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84636\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-released.png\" alt=\"PHP 8.0 An\u00fancio Adendo\" width=\"399\" height=\"270\"><figcaption id=\"caption-attachment-84636\" class=\"wp-caption-text\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 An\u00fancio Adendo<\/a><\/figcaption><\/figure>\n<p>Voc\u00ea est\u00e1 pronto? Vamos come\u00e7ar!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2 id=\"jit\">PHP JIT (compilador Just in Time)<\/h2>\n<p>A caracter\u00edstica mais aclamada que vem com o PHP 8 \u00e9 o <strong>compilador Just-in-time (JIT)<\/strong>. Do que se trata o JIT?<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/jit\">A proposta da RFC<\/a> descreve o JIT da seguinte forma:<\/p>\n<blockquote><p>&#8220;O PHP JIT \u00e9 implementado como uma parte quase independente do OPcache. Ele pode ser habilitado\/desabilitado em tempo de compila\u00e7\u00e3o e em tempo de execu\u00e7\u00e3o do PHP. Quando habilitado, o c\u00f3digo nativo dos arquivos PHP \u00e9 armazenado em uma regi\u00e3o adicional da mem\u00f3ria compartilhada do OPcache e op_array\u2192opcodes[].handler(s) mant\u00e9m apontadores para os pontos de entrada do c\u00f3digo JIT-ed&#8221;<\/p><\/blockquote>\n<p>Ent\u00e3o, como chegamos ao JIT, e qual \u00e9 a diferen\u00e7a entre JIT vs OPcache?<\/p>\n<p>Para entender melhor o que \u00e9 JIT para PHP, vamos dar uma r\u00e1pida olhada em como o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-php\/\">PHP<\/a> executa o c\u00f3digo fonte at\u00e9 o resultado final.<\/p>\n<p>A execu\u00e7\u00e3o do PHP \u00e9 um processo de 4 etapas:<\/p>\n<ul>\n<li><strong>Lexing\/Tokenizing<\/strong>: Primeiro, o int\u00e9rprete l\u00ea o c\u00f3digo PHP e constr\u00f3i um conjunto de fichas.<\/li>\n<li><strong>Parsing<\/strong>: O int\u00e9rprete verifica se o script corresponde \u00e0s regras de sintaxe e usa tokens para construir uma <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\">\u00c1rvore de Sintaxe Abstrata<\/a> (AST), <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_syntax_tree\">uma representa\u00e7\u00e3o hier\u00e1rquica da estrutura do c\u00f3digo fonte<\/a>.<\/li>\n<\/ul>\n<ul>\n<li><strong>Compila\u00e7\u00e3o<\/strong>: O int\u00e9rprete atravessa a \u00e1rvore e traduz os n\u00f3s AST em opcodes Zend de baixo n\u00edvel, que s\u00e3o identificadores num\u00e9ricos que determinam o tipo de <a href=\"https:\/\/nikic.github.io\/2017\/04\/14\/PHP-7-Virtual-machine.html\">instru\u00e7\u00e3o executada pela Zend VM<\/a>.<\/li>\n<li><strong>Interpreta\u00e7\u00e3o<\/strong>: Os opcodes s\u00e3o interpretados e executados na Zend VM.<\/li>\n<\/ul>\n<p>A imagem a seguir mostra uma representa\u00e7\u00e3o visual do processo b\u00e1sico de execu\u00e7\u00e3o do PHP.<\/p>\n<figure id=\"attachment_73105\" aria-describedby=\"caption-attachment-73105\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-73105\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-execution-1.png\" alt=\"Processo b\u00e1sico de execu\u00e7\u00e3o do PHP\" width=\"1100\" height=\"1460\"><figcaption id=\"caption-attachment-73105\" class=\"wp-caption-text\">Processo b\u00e1sico de execu\u00e7\u00e3o do PHP<\/figcaption><\/figure>\n<p>Ent\u00e3o, como o OPcache torna o PHP mais r\u00e1pido? E que mudan\u00e7as no processo de execu\u00e7\u00e3o com o JIT?<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>A extens\u00e3o OPcache<\/h3>\n<p>PHP \u00e9 uma linguagem interpretada. Isto significa que, quando um script PHP \u00e9 executado, o int\u00e9rprete analisa, compila e executa o c\u00f3digo uma e outra vez a cada solicita\u00e7\u00e3o. Isto pode resultar em <a href=\"https:\/\/phptherightway.com\/#opcode_cache\">desperd\u00edcio de recursos da CPU<\/a> e tempo adicional.<\/p>\n<p>\u00c9 aqui que entra a <a href=\"https:\/\/www.php.net\/manual\/en\/intro.opcache.php\">extens\u00e3o OPcache<\/a> para jogar:<\/p>\n<blockquote><p>&#8220;OPcache melhora a performance do PHP ao armazenar bytecode de script pr\u00e9-compilado na mem\u00f3ria compartilhada, removendo assim a necessidade do PHP carregar e analisar scripts em cada solicita\u00e7\u00e3o&#8221;<\/p><\/blockquote>\n<p>Com o OPcache ativado, o interpretador PHP passa pelo processo de 4 etapas mencionado acima apenas quando o script \u00e9 executado pela primeira vez. Como os bytecodes PHP s\u00e3o armazenados em mem\u00f3ria compartilhada, eles est\u00e3o imediatamente dispon\u00edveis como representa\u00e7\u00e3o intermedi\u00e1ria de baixo n\u00edvel e podem ser executados na Zend VM imediatamente.<\/p>\n<figure id=\"attachment_73080\" aria-describedby=\"caption-attachment-73080\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-73080\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-execution-2.png\" alt=\"Processo de execu\u00e7\u00e3o PHP com OPcache habilitado\" width=\"1100\" height=\"1560\"><figcaption id=\"caption-attachment-73080\" class=\"wp-caption-text\">Processo de execu\u00e7\u00e3o PHP com OPcache habilitado<\/figcaption><\/figure>\n<p>A partir do PHP 5.5, a extens\u00e3o Zend OPcache est\u00e1 dispon\u00edvel por padr\u00e3o, e voc\u00ea pode verificar se voc\u00ea a tem configurada corretamente, simplesmente <a href=\"https:\/\/kinsta.com\/pt\/blog\/phpinfo\/\">ligando para <code>phpinfo()<\/code><\/a> a partir de um script em seu servidor ou verificando seu arquivo php.ini (veja as <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\">configura\u00e7\u00f5es de configura\u00e7\u00e3o do OPcache<\/a>).<\/p>\n<p>Leitura sugerida: <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-limite-memoria\/\">Como melhorar o limite de mem\u00f3ria PHP no WordPress<\/a>.<\/p>\n<figure id=\"attachment_73106\" aria-describedby=\"caption-attachment-73106\" style=\"width: 1926px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-73106\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/zend-opcache.jpg\" alt=\"Zend OPcache section in a phpinfo page\" width=\"1926\" height=\"992\"><figcaption id=\"caption-attachment-73106\" class=\"wp-caption-text\">Zend OPcache section in a phpinfo page<\/figcaption><\/figure>\n<h3>Pr\u00e9-carga<\/h3>\n<p>OPcache foi recentemente melhorado com a implementa\u00e7\u00e3o do <a href=\"https:\/\/wiki.php.net\/rfc\/preload\">pr\u00e9-carregamento<\/a>, um novo recurso OPcache adicionado com <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/\">PHP 7.4<\/a>. O pr\u00e9-carregamento fornece uma maneira de armazenar um conjunto espec\u00edfico de scripts na mem\u00f3ria OPcache<em>&#8220;antes que qualquer c\u00f3digo do aplicativo seja executado&#8221;<\/em>. &#8220;Ainda assim, ele n\u00e3o traz melhorias tang\u00edveis de performance para aplicativos t\u00edpicas baseadas na web.<\/p>\n<p>Voc\u00ea pode ler mais sobre pr\u00e9-carrgamento em <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#preloading\">nossa introdu\u00e7\u00e3o ao PHP 7.4<\/a>.<\/p>\n<p>Com o JIT, o PHP d\u00e1 um passo \u00e0 frente.<\/p>\n<h3>JIT &#8211; O compilador Just in Time<\/h3>\n<p>Mesmo que os opcodes sejam de baixo n\u00edvel de representa\u00e7\u00e3o intermedi\u00e1ria, eles ainda t\u00eam que ser compilados em c\u00f3digo de m\u00e1quina. JIT &#8220;n\u00e3o introduz nenhuma forma adicional IR (Intermediate Representation)&#8221;, mas usa <a href=\"https:\/\/luajit.org\/dynasm.html\">DynASM<\/a> (Dynamic Assembler for code generation engines) para gerar c\u00f3digo nativo diretamente do byte-c\u00f3digo PHP.<\/p>\n<p>Em resumo, o <strong>JIT traduz as partes quentes do c\u00f3digo intermedi\u00e1rio em c\u00f3digo de m\u00e1quina<\/strong>. Contornando a compila\u00e7\u00e3o, ele seria capaz de trazer melhorias consider\u00e1veis na performance e uso de mem\u00f3ria.<\/p>\n<p>Zeev Surasky, co-autor da proposta PHP JIT, mostra o quanto os c\u00e1lculos seriam mais r\u00e1pidos com o JIT:<\/p>\n<p><kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=dWH65pmnsrI\"><\/kinsta-video><\/p>\n<p>Mas, o JIT efetivamente melhoraria o <a href=\"https:\/\/kinsta.com\/pt\/blog\/desempenho-do-wordpress\/\">desempenho do WordPress<\/a>?<\/p>\n<h3>JIT para aplicativos web em tempo real<\/h3>\n<p>De acordo com a RFC do JIT, a implementa\u00e7\u00e3o do compilador just in time deve melhorar o desempenho do PHP. Mas realmente experimentar\u00edamos tais melhorias em aplicativos da vida real como WordPress?<\/p>\n<p>Os primeiros testes mostram que o JIT faria com que as cargas de trabalho intensivas da CPU funcionassem significativamente mais r\u00e1pido. <a href=\"https:\/\/wiki.php.net\/rfc\/jit#performance\">No entanto, o RFC adverte<\/a>:<\/p>\n<blockquote><p>&#8220;&#8230; como as tentativas anteriores &#8211; atualmente n\u00e3o parece melhorar significativamente aplicativos da vida real como WordPress (com opcache.jit=1235 326 req\/sec vs 315 req\/sec).<\/p>\n<p>Est\u00e1 previsto um esfor\u00e7o adicional, melhorando o JIT para aplicativos em tempo real, usando perfis e otimiza\u00e7\u00f5es especulativas&#8221;<\/p><\/blockquote>\n<p>Com o JIT habilitado, o c\u00f3digo n\u00e3o seria executado pela Zend VM, mas pela pr\u00f3pria CPU, o que melhoraria a velocidade de c\u00e1lculo. Aplicativos Web como <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-wordpress\/\">WordPress<\/a> tamb\u00e9m dependem de outros fatores como <a href=\"https:\/\/kinsta.com\/pt\/blog\/ttfb\/\">TTFB<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/solucionar-reparar-problemas-banco-dados\/\">otimiza\u00e7\u00e3o de banco de dados<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/aprenda\/http2\/\">solicita\u00e7\u00f5es HTTP<\/a>, etc.<\/p>\n<figure id=\"attachment_84635\" aria-describedby=\"caption-attachment-84635\" style=\"width: 1884px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-84635\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2020\/05\/php-8-performance-diagram.png\" alt=\"Contribui\u00e7\u00e3o relativa do JIT para o desempenho do PHP 8\" width=\"1884\" height=\"1206\"><figcaption id=\"caption-attachment-84635\" class=\"wp-caption-text\">Contribui\u00e7\u00e3o relativa do JIT para o desempenho do PHP 8 (Fonte de imagem: <a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\">PHP 8.0 Announcement Addendum<\/a>)<\/figcaption><\/figure>\n<p>Portanto, n\u00e3o devemos esperar um aumento significativo na velocidade de execu\u00e7\u00e3o do PHP quando se trata de WordPress e aplicativos semelhantes. No entanto, o JIT poderia trazer v\u00e1rios benef\u00edcios para os <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-desenvolvedor-web\/\">desenvolvedores<\/a>.<\/p>\n<p><a href=\"https:\/\/externals.io\/message\/103903#103927\">De acordo com Nikita Popov<\/a>:<\/p>\n<blockquote><p>&#8220;Os benef\u00edcios do compilador JIT s\u00e3o, (e como j\u00e1 foi delineado no RFC):<\/p>\n<ul>\n<li>Desempenho significativamente melhor para c\u00f3digo num\u00e9rico.<\/li>\n<li>Desempenho ligeiramente melhor para c\u00f3digo &#8220;t\u00edpico&#8221; de aplicativo web PHP.<\/li>\n<li>O potencial para mover mais c\u00f3digo de C para PHP, porque o PHP agora ser\u00e1 suficientemente r\u00e1pido&#8221;<\/li>\n<\/ul>\n<\/blockquote>\n<p>Ent\u00e3o, enquanto o JIT dificilmente trar\u00e1 grandes melhorias na performance do WordPress, ele estar\u00e1 atualizando o PHP para o pr\u00f3ximo n\u00edvel, fazendo dele uma linguagem na qual muitas fun\u00e7\u00f5es poderiam agora ser escritas diretamente.<\/p>\n<p>O lado negativo seria a maior complexidade que pode aumentar a <a href=\"https:\/\/kinsta.com\/pt\/blog\/manutencao-101-do-wordpress\/\">manuten\u00e7\u00e3o<\/a>, estabilidade e custos <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-debug\/\">de depura\u00e7\u00e3o<\/a>. De acordo com Dmitry Stogov:<\/p>\n<blockquote><p>&#8220;O JIT \u00e9 extremamente simples, mas de qualquer forma ele aumenta o n\u00edvel de toda a complexidade do PHP, o risco de novos tipos de bugs e o custo de desenvolvimento e manuten\u00e7\u00e3o&#8221;<\/p><\/blockquote>\n<p>A proposta de incluir o JIT no PHP 8 foi aprovada com 50 a 2 votos.<\/p>\n\n<h2>Melhorias e novas funcionalidades do PHP 8<\/h2>\n<p>Al\u00e9m do JIT, n\u00f3s podemos esperar muitas funcionalidades e melhorias com o PHP 8. A lista a seguir \u00e9 nossa sele\u00e7\u00e3o das pr\u00f3ximas adi\u00e7\u00f5es e mudan\u00e7as que devem tornar o PHP mais confi\u00e1vel e eficiente.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"17\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"constructor-property-promotion\">Promo\u00e7\u00e3o de propriedade dos construtores<\/h3>\n<p>Como resultado de uma discuss\u00e3o cont\u00ednua sobre a melhoria da <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">ergonomia dos objetos em PHP<\/a>, a <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion\">Constructor Property Promotion RFC<\/a> prop\u00f5e uma nova e mais concisa sintaxe que simplificar\u00e1 a declara\u00e7\u00e3o de propriedade, tornando-a mais curta e menos redundante.<\/p>\n<p>Esta proposta se refere apenas aos <strong>par\u00e2metros promovidos<\/strong>, ou seja, aqueles par\u00e2metros do m\u00e9todo prefixados com palavras-chave de visibilidade \u00a0<strong>public<\/strong>,\u00a0<strong>protected<\/strong>, e <strong>private<\/strong>.<\/p>\n<p>Atualmente, todas as propriedades t\u00eam que ser repetidas v\u00e1rias vezes (pelo menos quatro vezes) antes que possamos us\u00e1-las com objetos. Considere o seguinte exemplo da RFC:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public int $x;\n    public int $y;\n    public int $z;\n\n    public function __construct(\n        int $x = 0,\n        int $y = 0,\n        int $z = 0,\n    ) {\n        $this-&gt;x = $x;\n        $this-&gt;y = $y;\n        $this-&gt;z = $z;\n    }\n}<\/code><\/pre>\n<p>De acordo com Nikita Popov, a autora do RFC, n\u00f3s temos que escrever o nome da propriedade pelo menos quatro vezes em tr\u00eas lugares diferentes: a declara\u00e7\u00e3o da propriedade, os par\u00e2metros do construtor e a atribui\u00e7\u00e3o da propriedade. Esta sintaxe n\u00e3o \u00e9 particularmente utiliz\u00e1vel, especialmente em classes com muitas propriedades e nomes mais descritivos.<\/p>\n<p>Esta RFC se prop\u00f5e a fundir o construtor e a defini\u00e7\u00e3o dos par\u00e2metros. Assim, a partir do PHP 8, n\u00f3s temos uma maneira mais utiliz\u00e1vel de declarar par\u00e2metros. O c\u00f3digo visto acima pode mudar como mostrado abaixo:<\/p>\n<pre><code class=\"language-php\">class Point {\n    public function __construct(\n        public int $x = 0,\n        public int $y = 0,\n        public int $z = 0,\n    ) {}\n}<\/code><\/pre>\n<p>E \u00e9 isso a\u00ed. Ent\u00e3o n\u00f3s temos uma nova maneira de promover propriedades que s\u00e3o mais curtas, mais leg\u00edveis, e menos propensas a erros. <a href=\"https:\/\/phpinternals.news\/53\">De acordo com Nikita<\/a>:<\/p>\n<blockquote><p>\u00c9 uma simples transforma\u00e7\u00e3o sint\u00e1tica que estamos fazendo. Mas isso reduz a quantidade de c\u00f3digo de placa de caldeira que voc\u00ea tem que escrever para objetos de valor em particular&#8230;<\/p><\/blockquote>\n<p>A declara\u00e7\u00e3o de propriedade \u00e9 transformada como t\u00ednhamos declarado explicitamente essas propriedades, e podemos usar a <a href=\"https:\/\/www.php.net\/manual\/en\/intro.reflection.php\">API Reflection<\/a> para introspectar defini\u00e7\u00f5es de propriedade antes da execu\u00e7\u00e3o (veja <a href=\"https:\/\/wiki.php.net\/rfc\/constructor_promotion#desugaring\">Desugaring<\/a>):<\/p>\n<blockquote><p>Reflection (e outros mecanismos de introspec\u00e7\u00e3o) observar\u00e1 o estado ap\u00f3s o desugaring. Isto significa que as propriedades promovidas aparecer\u00e3o da mesma forma que as propriedades explicitamente declaradas, e os argumentos dos construtores promovidos aparecer\u00e3o como argumentos dos construtores comuns.<\/p><\/blockquote>\n<pre><code class=\"language-php\">\/\/ before desugaring\nclass Point {\n    public function __construct(public int $x = 0) {}\n}\n\n\/\/ after desugaring\nclass Point {\n    public int $x;\n\n    public function __construct(int $x = 0) {\n        $this-&gt;x = $x;\n    }\n}<\/code><\/pre>\n<h4>Heran\u00e7a<\/h4>\n<p>N\u00f3s n\u00e3o temos nenhuma limita\u00e7\u00e3o no uso da heran\u00e7a em conjunto com os par\u00e2metros promovidos. De qualquer forma, n\u00e3o h\u00e1 uma rela\u00e7\u00e3o particular entre pais e filhos construtores de classes. <a href=\"https:\/\/phpinternals.news\/53\">De acordo com Nikita<\/a>:<\/p>\n<blockquote><p>Normalmente, n\u00f3s dizemos que os m\u00e9todos sempre t\u00eam que ser compat\u00edveis com o m\u00e9todo dos pais. [&#8230;] mas esta regra n\u00e3o se aplica para o construtor. Ent\u00e3o o construtor realmente pertence a uma \u00fanica classe, e construtores entre classe pai e crian\u00e7a n\u00e3o t\u00eam que ser compat\u00edveis de nenhuma forma.<\/p><\/blockquote>\n<p>Aqui est\u00e1 um exemplo:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public function __construct(\n        public int $x = 0\n    ) {}\n}\n\nclass Child extends Test {\n    public function __construct(\n        $x, \n        public int $y = 0,\n        public int $z = 0,\n    ) {\n        parent::__construct($x);\n    }\n}<\/code><\/pre>\n<h4>O que n\u00e3o \u00e9 permitido com as propriedades promovidas<\/h4>\n<p>As propriedades promovidas s\u00e3o permitidas em construtores n\u00e3o abstratos e funcionalidades, mas h\u00e1 v\u00e1rias limita\u00e7\u00f5es que vale a pena mencionar aqui.<\/p>\n<h5>Construtores abstratos<\/h5>\n<p>Propriedades promovidas n\u00e3o s\u00e3o permitidas em classes e interfaces abstratas:<\/p>\n<pre><code class=\"language-php\">abstract class Test {\n    \/\/ Error: Abstract constructor.\n    abstract public function __construct(private $x);\n}\n \ninterface Test {\n    \/\/ Error: Abstract constructor.\n    public function __construct(private $x);\n}<\/code><\/pre>\n<h5>Nullability<\/h5>\n<p>Uma das restri\u00e7\u00f5es mais not\u00e1veis est\u00e1 relacionada \u00e0 nulidade. Anteriormente, n\u00f3s us\u00e1vamos um tipo que n\u00e3o era explicitamente anul\u00e1vel. Mas com um valor padr\u00e3o nulo, o tipo era implicitamente anul\u00e1vel. Mas com tipos de propriedade, n\u00f3s n\u00e3o temos este comportamento impl\u00edcito porque os par\u00e2metros promovidos requerem uma declara\u00e7\u00e3o de propriedade, e o tipo nulo deve ser declarado explicitamente. Veja o seguinte exemplo da RFC:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Using null default on non-nullable property\n    public function __construct(public Type $prop = null) {}\n\n    \/\/ Correct: Make the type explicitly nullable instead\n    public function __construct(public ?Type $prop = null) {}\n}<\/code><\/pre>\n<h5>Tipo Callable<\/h5>\n<p>Como o tipo cham\u00e1vel n\u00e3o \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#typed-properties\">tipo suportado para propriedades<\/a>, n\u00e3o estamos autorizados a usar o tipo cham\u00e1vel em propriedades promovidas:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Callable type not supported for properties.\n    public function __construct(public callable $callback) {}\n}<\/code><\/pre>\n<h5>A palavra-chave var n\u00e3o \u00e9 permitida<\/h5>\n<p>Somente uma palavra-chave de visibilidade pode ser usada com par\u00e2metros promovidos, portanto n\u00e3o \u00e9 permitido declarar propriedades do construtor com a palavra-chave <code>var<\/code> (veja o seguinte exemplo do RFC):<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: \"var\" keyword is not supported.\n    public function __construct(var $prop) {}\n}<\/code><\/pre>\n<h5>Sem duplica\u00e7\u00f5es permitidas<\/h5>\n<p>N\u00f3s podemos combinar propriedades promovidas e propriedades expl\u00edcitas na mesma classe, mas as propriedades n\u00e3o podem ser declaradas duas vezes:<\/p>\n<pre><code class=\"language-php\">class Test {\n    public string $prop;\n    public int $explicitProp;\n\n    \/\/ Correct\n    public function __construct(public int $promotedProp, int $arg) {\n        $this-&gt;explicitProp = $arg;\n    }\n\n    \/\/ Error: Redeclaration of property.\n    public function __construct(public string $prop) {}\n}<\/code><\/pre>\n<h5>Par\u00e2metros Variadic n\u00e3o s\u00e3o permitidos<\/h5>\n<p>A raz\u00e3o aqui \u00e9 que o tipo declarado \u00e9 diferente do par\u00e2metro vari\u00e1dico, que na verdade \u00e9 um array:<\/p>\n<pre><code class=\"language-php\">class Test {\n    \/\/ Error: Variadic parameter.\n    public function __construct(public string ...$strings) {}\n}<\/code><\/pre>\n<h4>Leituras adicionais<\/h4>\n<p>Para uma vis\u00e3o mais pr\u00f3xima na Costructor Property Promotion, ou\u00e7a esta <a href=\"https:\/\/phpinternals.news\/53\">entrevista com Nikita Popov<\/a>. Para uma vis\u00e3o aprofundada da ergonomia dos objetos em PHP, veja <a href=\"https:\/\/hive.blog\/php\/@crell\/improving-php-s-object-ergonomics\">este post<\/a> e a seguinte <a href=\"https:\/\/phpinternals.news\/51\">entrevista com Larry Garfield<\/a>.<\/p>\n<h3 id=\"abstract-trait-methods\">Valida\u00e7\u00e3o para m\u00e9todos de tra\u00e7os (trait\u00a0) abstratos<\/h3>\n<p>Os <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php\">tra\u00e7os<\/a> s\u00e3o definidos como &#8220;um mecanismo para reutiliza\u00e7\u00e3o de c\u00f3digo em linguagens de heran\u00e7a \u00fanica, como PHP&#8221; Tipicamente, eles s\u00e3o usados para declarar m\u00e9todos que podem ser usados em m\u00faltiplas classes.<\/p>\n<p>Um tra\u00e7o tamb\u00e9m pode conter m\u00e9todos abstratos. Estes m\u00e9todos simplesmente declaram a assinatura do m\u00e9todo, mas a implementa\u00e7\u00e3o deve ser feita dentro da classe que utiliza o tra\u00e7o.<\/p>\n<p>De acordo com o <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.traits.php#language.oop5.traits.abstract\">manual PHP<\/a>,<\/p>\n<blockquote><p>&#8220;Tra\u00e7os apoiam o uso de m\u00e9todos abstratos a fim de impor exig\u00eancias \u00e0 classe expositora&#8221;<\/p><\/blockquote>\n<p>Isto tamb\u00e9m significa que as assinaturas dos m\u00e9todos devem coincidir. Em outras palavras, o tipo e o n\u00famero de argumentos requeridos <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.abstract.php\">precisam ser os mesmos<\/a>.<\/p>\n<p>De qualquer forma, <a href=\"https:\/\/externals.io\/message\/108065#108164\">de acordo com Nikita Popov<\/a>, autora do RFC, a valida\u00e7\u00e3o da assinatura \u00e9 atualmente aplicada apenas de forma pontual:<\/p>\n<blockquote>\n<ul>\n<li>N\u00e3o \u00e9 aplicado no caso mais comum, onde a implementa\u00e7\u00e3o do m\u00e9todo \u00e9 fornecida pela classe utilizadora: <a href=\"https:\/\/3v4l.org\/SeVK3\">https:\/\/3v4l.org\/SeVK3<\/a><\/li>\n<li>\u00c9 aplicada se a implementa\u00e7\u00e3o vier de uma classe m\u00e3e: <a href=\"https:\/\/3v4l.org\/4VCIp\">https:\/\/3v4l.org\/4VCIp<\/a><\/li>\n<li>\u00c9 aplicada se a implementa\u00e7\u00e3o vier de uma classe infantil: <a href=\"https:\/\/3v4l.org\/q7Bq2\">https:\/\/3v4l.org\/q7Bq2<\/a><\/li>\n<\/ul>\n<\/blockquote>\n<p>O seguinte exemplo de Nikita se refere ao primeiro caso (assinatura n\u00e3o for\u00e7ada):<\/p>\n<pre><code class=\"language-php\">trait T {\n\tabstract public function test(int $x);\n}\n \nclass C {\n\tuse T;\n\n\t\/\/ Allowed, but shouldn't be due to invalid type.\n\tpublic function test(string $x) {}\n}<\/code><\/pre>\n<p>Dito isto, <a href=\"https:\/\/wiki.php.net\/rfc\/abstract_trait_method_validation\">esta RFC<\/a> prop\u00f5e sempre lan\u00e7ar um erro fatal se o m\u00e9todo de implementa\u00e7\u00e3o n\u00e3o for compat\u00edvel com o m\u00e9todo do tra\u00e7o abstrato, independentemente de sua origem:<\/p>\n<pre><code>Fatal error: Declaration of C::test(string $x) must be compatible with T::test(int $x) in \/path\/to\/your\/test.php on line 10<\/code><\/pre>\n<p>Esta RFC foi aprovada por unanimidade.<\/p>\n<h3 id=\"incompatible-method-signatures\">Assinaturas incompat\u00edveis do m\u00e9todo<\/h3>\n<p>Em PHP, erros de heran\u00e7a devido a assinaturas de m\u00e9todos incompat\u00edveis lan\u00e7am ou um erro fatal ou um aviso, dependendo do que est\u00e1 causando o erro.<\/p>\n<p>Se uma classe est\u00e1 implementando uma interface, assinaturas de m\u00e9todos incompat\u00edveis lan\u00e7am um erro fatal. De acordo com a <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.interfaces.php\">documenta\u00e7\u00e3o da interface de objetos<\/a>:<\/p>\n<blockquote><p>&#8220;A classe implementando a interface deve usar uma assinatura de m\u00e9todo que seja compat\u00edvel com LSP (Liskov Substitution Principle). N\u00e3o fazer isso resultar\u00e1 em um erro fatal&#8221;<\/p><\/blockquote>\n<p>Aqui est\u00e1 um exemplo de um <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">erro de heran\u00e7a com uma interface<\/a>:<\/p>\n<pre><code class=\"language-php\">interface I {\n\tpublic function method(array $a);\n}\nclass C implements I {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>No PHP 7.4, o c\u00f3digo acima lan\u00e7aria o seguinte erro:<\/p>\n<pre><code>Fatal error: Declaration of C::method(int $a) must be compatible with I::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Uma fun\u00e7\u00e3o em uma child classe com uma assinatura incompat\u00edvel lan\u00e7aria um aviso. Veja o seguinte c\u00f3digo da RFC:<\/p>\n<pre><code class=\"language-php\">class C1 {\n\tpublic function method(array $a) {}\n}\nclass C2 extends C1 {\n\tpublic function method(int $a) {}\n}<\/code><\/pre>\n<p>No PHP 7.4, o c\u00f3digo acima simplesmente lan\u00e7aria um aviso:<\/p>\n<pre><code>Warning: Declaration of C2::method(int $a) should be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<p>Agora, <a href=\"https:\/\/wiki.php.net\/rfc\/lsp_errors\">esta RFC<\/a> prop\u00f5e sempre atirar um erro fatal para assinaturas de m\u00e9todos incompat\u00edveis. Com o PHP 8, o c\u00f3digo que vimos anteriormente acima iria provocar o seguinte:<\/p>\n<pre><code>Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a) in \/path\/to\/your\/test.php on line 7<\/code><\/pre>\n<h3 id=\"negative-array-index\">Arrays come\u00e7ando com um \u00edndice negativo<\/h3>\n<p>Em PHP, se um array come\u00e7a com um \u00edndice negativo (<code>start_index &lt; 0<\/code>), os seguintes \u00edndices come\u00e7ar\u00e3o a partir de 0 (mais sobre isso na <a href=\"https:\/\/www.php.net\/manual\/en\/function.array-fill.php\">documenta\u00e7\u00e3o<code>array_fill<\/code> <\/a>). Veja o exemplo a seguir:<\/p>\n<pre><code class=\"language-php\">$a = array_fill(-5, 4, true);\nvar_dump($a);<\/code><\/pre>\n<p>No PHP 7.4, o resultado seria o seguinte:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[0]=&gt;\n\tbool(true)\n\t[1]=&gt;\n\tbool(true)\n\t[2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Agora, <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index\">este RFC<\/a> prop\u00f5e mudar as coisas para que o segundo \u00edndice seja <code>start_index + 1<\/code>, qualquer que seja o valor de <code>start_index<\/code>.<\/p>\n<p>No PHP 8, o c\u00f3digo acima resultaria na seguinte matriz:<\/p>\n<pre><code>array(4) {\n\t[-5]=&gt;\n\tbool(true)\n\t[-4]=&gt;\n\tbool(true)\n\t[-3]=&gt;\n\tbool(true)\n\t[-2]=&gt;\n\tbool(true)\n}<\/code><\/pre>\n<p>Com o PHP 8, arrays come\u00e7ando com um \u00edndice negativo mudam seu comportamento. Leia mais sobre as incompatibilidades para tr\u00e1s na <a href=\"https:\/\/wiki.php.net\/rfc\/negative_array_index#backward_incompatible_changes\">RFC<\/a>.<\/p>\n<h3 id=\"union-types-2-0\" class=\"has-anchor-hash\">Union Types 2.0<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Union_type\">Union Types 2.0<\/a>\u00a0aceitam valores que podem ser de diferentes tipos. Atualmente, o PHP n\u00e3o oferece suporte a tipos de uni\u00e3o, exceto para a sintaxe <code>?Type<\/code> e para o tipo especial <code>iterable<\/code>.<\/p>\n<p>Antes do PHP 8, os tipos de uni\u00e3o s\u00f3 podiam ser especificados em anota\u00e7\u00f5es phpdoc, como mostrado no exemplo a seguir da RFC:<\/p>\n<pre><code class=\"language-php\">class Number {\n\t\/**\n\t * @var int|float $number\n\t *\/\n\tprivate $number;\n\n\t\/**\n\t * @param int|float $number\n\t *\/\n\tpublic function setNumber($number) {\n\t\t$this-&gt;number = $number;\n\t}\n\n\t\/**\n\t * @return int|float\n\t *\/\n\tpublic function getNumber() {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Agora, <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">a RFC do tipo 2.<\/a> 0 prop\u00f5e adicionar suporte para tipos de sindicatos em assinaturas de fun\u00e7\u00f5es, para que n\u00e3o confiemos mais na documenta\u00e7\u00e3o em linha, mas definamos os tipos de sindicatos com uma sintaxe <code>T1|T2|...<\/code>:<\/p>\n<pre><code class=\"language-php\">class Number {\n\tprivate int|float $number;\n\n\tpublic function setNumber(int|float $number): void {\n\t\t$this-&gt;number = $number;\n\t}\n\n\tpublic function getNumber(): int|float {\n\t\treturn $this-&gt;number;\n\t}\n}<\/code><\/pre>\n<p>Como explicado por Nikita Popov no RFC,<\/p>\n<blockquote><p>&#8220;Apoiar tipos de sindicatos no idioma nos permite mover mais informa\u00e7\u00f5es do tipo phpdoc para assinaturas de fun\u00e7\u00e3o, com as vantagens habituais que isso traz:<\/p>\n<ul>\n<li>Os tipos s\u00e3o realmente aplicados, ent\u00e3o os erros podem ser pegos cedo.<\/li>\n<li>Como eles s\u00e3o aplicados, \u00e9 menos prov\u00e1vel que as informa\u00e7\u00f5es do tipo se tornem desatualizadas ou percam os casos de bordas.<\/li>\n<li>Os tipos s\u00e3o verificados durante a heran\u00e7a, aplicando o Princ\u00edpio de Substitui\u00e7\u00e3o Liskov.<\/li>\n<li>Os tipos est\u00e3o dispon\u00edveis atrav\u00e9s do Reflection.<\/li>\n<li>A sintaxe \u00e9 muito menos &#8220;boilerplate-y&#8221; do que &#8220;phpdoc&#8221;<\/li>\n<\/ul>\n<\/blockquote>\n<p>Os tipos de Uni\u00e3o suportam todos os tipos dispon\u00edveis, com algumas limita\u00e7\u00f5es:<\/p>\n<ul>\n<li>O tipo <code>void<\/code> n\u00e3o poderia ser parte de um sindicato, pois <code>void<\/code> significa que uma fun\u00e7\u00e3o <a href=\"https:\/\/wiki.php.net\/rfc\/void_return_type\">n\u00e3o retorna qualquer valor<\/a>.<\/li>\n<li>O tipo <code>null<\/code> s\u00f3 \u00e9 suportado em tipos de uni\u00e3o, mas seu uso como um tipo aut\u00f4nomo n\u00e3o \u00e9 permitido.<\/li>\n<li>A nota\u00e7\u00e3o do tipo nulo (<code>?T<\/code>) tamb\u00e9m \u00e9 permitida, significando <code>T|null<\/code>, mas n\u00e3o \u00e9 permitido incluir a nota\u00e7\u00e3o <code>?T<\/code> nos tipos de uni\u00e3o (<code>?T1|T2<\/code> n\u00e3o \u00e9 permitido e devemos usar <code>T1|T2|null<\/code> em seu lugar).<\/li>\n<li>Como muitas fun\u00e7\u00f5es (isto \u00e9, <code>strpos()<\/code>, <code>strstr()<\/code>, <code>substr()<\/code>, etc.) incluem <code>false<\/code> entre os poss\u00edveis tipos de retorno, o pseudo-tipo <code>false<\/code> tamb\u00e9m \u00e9 suportado.<\/li>\n<\/ul>\n<p>Voc\u00ea pode ler mais sobre a <a href=\"https:\/\/wiki.php.net\/rfc\/union_types_v2\">Union Types V2<\/a> na RFC.<\/p>\n<h3 id=\"type-errors-internal-functions\">Erros consistentes do tipo fun\u00e7\u00f5es internas<\/h3>\n<p>Ao passar um par\u00e2metro de tipo ilegal, fun\u00e7\u00f5es <a href=\"https:\/\/www.php.net\/manual\/en\/functions.internal.php\">internas<\/a> e fun\u00e7\u00f5es <a href=\"https:\/\/www.php.net\/manual\/en\/functions.user-defined.php\">definidas pelo usu\u00e1rio<\/a> se comportam de forma diferente.<\/p>\n<p>Fun\u00e7\u00f5es definidas pelo usu\u00e1rio lan\u00e7am um <code>TypeError<\/code>, mas fun\u00e7\u00f5es internas se comportam de v\u00e1rias maneiras, dependendo de v\u00e1rias condi\u00e7\u00f5es. De qualquer forma, o comportamento t\u00edpico \u00e9 lan\u00e7ar um aviso e retornar <code>null<\/code>. Veja o seguinte exemplo no PHP 7.4:<\/p>\n<pre><code class=\"language-php\">var_dump(strlen(new stdClass));<\/code><\/pre>\n<p>Isto resultaria no seguinte aviso:<\/p>\n<pre><code>Warning: strlen() expects parameter 1 to be string, object given in \/path\/to\/your\/test.php on line 4\nNULL<\/code><\/pre>\n<p>Se <code>strict_types<\/code> estiver habilitado, ou se a informa\u00e7\u00e3o do argumento especificar tipos, o comportamento seria diferente. Em tais cen\u00e1rios, o erro de tipo \u00e9 detectado e resulta em um <code>TypeError<\/code>.<\/p>\n<p>Esta situa\u00e7\u00e3o levaria a uma s\u00e9rie de problemas bem explicados na <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors#issues\">se\u00e7\u00e3o de quest\u00f5es do RFC<\/a>.<\/p>\n<p>Para remover estas inconsist\u00eancias, <a href=\"https:\/\/wiki.php.net\/rfc\/consistent_type_errors\">esta RFC prop\u00f5e<\/a> fazer a an\u00e1lise interna dos par\u00e2metros APIs para sempre gerar um <code>ThrowError<\/code> no caso de um descasamento do tipo de par\u00e2metro.<\/p>\n<p>No PHP 8, o c\u00f3digo acima lan\u00e7a o seguinte erro:<\/p>\n<pre><code>Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in \/path\/to\/your\/test.php:4\nStack trace:\n#0 {main}\n  thrown in \/path\/to\/your\/test.php on line 4<\/code><\/pre>\n<h3 id=\"throw-expression\">Express\u00e3o throw Come<\/h3>\n<p>Em PHP, <code>throw<\/code> \u00e9 uma <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.intro.php\">declara\u00e7\u00e3o<\/a>, portanto n\u00e3o \u00e9 poss\u00edvel us\u00e1-la em lugares onde apenas uma <a href=\"https:\/\/www.php.net\/manual\/en\/language.expressions.php\">express\u00e3o<\/a> \u00e9 permitida.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/throw_expression\">Esta RFC<\/a> prop\u00f5e converter a <a href=\"https:\/\/www.php.net\/manual\/en\/language.exceptions.php\">declara\u00e7\u00e3o<code>throw<\/code> <\/a> em uma express\u00e3o para que ela possa ser usada em qualquer contexto onde as express\u00f5es s\u00e3o permitidas. Por exemplo, <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#arrow-functions\">fun\u00e7\u00f5es de seta<\/a>, <a href=\"https:\/\/wiki.php.net\/rfc\/isset_ternary\">operador de coalesc\u00eancia nula<\/a>, <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.comparison.php#language.operators.comparison.ternary\">operadores tern\u00e1rios e elvis<\/a>, etc.<\/p>\n<p>Veja os seguintes exemplos da RFC:<\/p>\n<pre><code class=\"language-php\">$callable = fn() =&gt; throw new Exception();\n\n\/\/ $value is non-nullable.\n$value = $nullableValue ?? throw new InvalidArgumentException();\n \n\/\/ $value is truthy.\n$value = $falsableValue ?: throw new InvalidArgumentException();<\/code><\/pre>\n<h3 id=\"weak-maps\" class=\"has-anchor-hash\">Weak Maps<\/h3>\n<p>Um Weak Maps \u00e9 uma cole\u00e7\u00e3o de dados (objetos) nos quais as chaves s\u00e3o fracamente referenciadas, significando que elas n\u00e3o s\u00e3o impedidas de serem coletadas.<\/p>\n<p>PHP 7.4 adicionou suporte a <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-4\/#weakreferences\">refer\u00eancias fracas<\/a> como uma forma de reter uma refer\u00eancia a um objeto que n\u00e3o impede que o objeto em si seja destru\u00eddo. Como apontado por Nikita Popov,<\/p>\n<blockquote><p>&#8220;Refer\u00eancias fracas em bruto s\u00e3o apenas de utilidade limitada por si mesmas e mapas fracos s\u00e3o muito mais comumente usados na pr\u00e1tica. N\u00e3o \u00e9 poss\u00edvel implementar um Weak Maps eficiente em cima de refer\u00eancias fracas em PHP porque a habilidade de registrar uma chamada de retorno de destrui\u00e7\u00e3o n\u00e3o \u00e9 fornecida&#8221;<\/p><\/blockquote>\n<p>\u00c9 por isso que <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">esta RFC<\/a> introduz uma classe <code>WeakMap<\/code> para criar objetos a serem usados como chaves fracas de mapas que podem ser destru\u00eddos e removidos do Weak Maps se n\u00e3o houver mais refer\u00eancias ao objeto chave.<\/p>\n<p>Em processos de longa dura\u00e7\u00e3o, isto evitaria vazamentos de mem\u00f3ria e melhoraria o desempenho. Veja o seguinte exemplo da RFC:<\/p>\n<pre><code class=\"language-php\">$map = new WeakMap;\n$obj = new stdClass;\n$map[$obj] = 42;\nvar_dump($map);<\/code><\/pre>\n<p>Com o PHP 8, o c\u00f3digo acima produziria o seguinte resultado (veja <a href=\"https:\/\/3v4l.org\/o6lZX\/rfc#output\">o c\u00f3digo em a\u00e7\u00e3o aqui<\/a>):<\/p>\n<pre><code>object(WeakMap)#1 (1) {\n\t[0]=&gt;\n\tarray(2) {\n\t\t[\"key\"]=&gt;\n\t\tobject(stdClass)#2 (0) {\n\t\t}\n\t\t[\"value\"]=&gt;\n\t\tint(42)\n\t}\n}<\/code><\/pre>\n<p>Se voc\u00ea desajustar o objeto, a chave \u00e9 automaticamente removida do Weak Maps:<\/p>\n<pre><code class=\"language-php\">unset($obj);\nvar_dump($map);<\/code><\/pre>\n<p>Agora o resultado seria o seguinte:<\/p>\n<pre><code>object(WeakMap)#1 (0) {\n}<\/code><\/pre>\n<p>Para uma vis\u00e3o mais detalhada dos mapas Fracos, veja <a href=\"https:\/\/wiki.php.net\/rfc\/weak_maps\">a RFC<\/a>. A proposta foi aprovada por unanimidade.<\/p>\n<h3 id=\"trailing-commas\">V\u00edrgula de rastreamento na lista de par\u00e2metros<\/h3>\n<p>As v\u00edrgulas de rastreamento s\u00e3o v\u00edrgulas anexadas a listas de itens em diferentes contextos. O PHP 7.2 introduziu v\u00edrgulas de <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-2\/#trailing-commas-in-list-syntax\">rastreamento em sintaxe de lista<\/a>, o PHP 7.3 introduziu <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-7-3\/#trailing-comma-in-function-calls\">v\u00edrgulas de rastreamento em chamadas de fun\u00e7\u00e3o<\/a>.<\/p>\n<p>O PHP 8 agora introduz <a href=\"https:\/\/wiki.php.net\/rfc\/trailing_comma_in_parameter_list\">v\u00edrgulas de rastreamento em listas de par\u00e2metros<\/a> com fun\u00e7\u00f5es, m\u00e9todos e fechamentos, como mostrado no exemplo a seguir:<\/p>\n<pre><code class=\"language-php\">class Foo {\n\tpublic function __construct(\n\t\tstring $x,\n\t\tint $y,\n\t\tfloat $z, \/\/ trailing comma\n\t) {\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n<p>Esta proposta foi aprovada com 58 votos a 1 voto.<\/p>\n<h3 id=\"class-syntax-on-objects\">Sintaxe ::classe permitida em objetos<\/h3>\n<p>Para buscar o nome de uma classe, n\u00f3s podemos usar a sintaxe <code>Foo\\Bar::class<\/code>. <a href=\"https:\/\/wiki.php.net\/rfc\/class_name_literal_on_object\">Esta RFC<\/a> prop\u00f5e estender a mesma sintaxe aos objetos para que agora seja poss\u00edvel ir buscar o nome da classe de um determinado objeto, como mostrado no exemplo abaixo:<\/p>\n<pre><code class=\"language-php\">$object = new stdClass;\nvar_dump($object::class); \/\/ \"stdClass\"\n \n$object = null;\nvar_dump($object::class); \/\/ TypeError<\/code><\/pre>\n<p>Com PHP 8, <code>$object::class<\/code> fornece o mesmo resultado que <code>get_class($object)<\/code>. Se <code>$object<\/code> n\u00e3o \u00e9 um objeto, ele lan\u00e7a uma exce\u00e7\u00e3o a <code>TypeError<\/code>.<\/p>\n<p>Esta proposta foi aprovada por unanimidade.<\/p>\n<h3 id=\"attributes\">Atributos v2<\/h3>\n<p>Atributos, tamb\u00e9m conhecidos como anota\u00e7\u00f5es, s\u00e3o metadados estruturados que podem ser usados para especificar propriedades para objetos, elementos ou arquivos.<\/p>\n<p>At\u00e9 o PHP 7.4, os doc-comments eram a \u00fanica maneira de adicionar metadados \u00e0s declara\u00e7\u00f5es de classes, fun\u00e7\u00f5es, etc. O <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">Attributes v2 RFC<\/a> introduz atributos PHP, definindo-os como uma forma de metadados estruturados e sint\u00e1ticos que podem ser adicionados a declara\u00e7\u00f5es de classes, propriedades, fun\u00e7\u00f5es, m\u00e9todos, par\u00e2metros e constantes.<\/p>\n<p>Atributos s\u00e3o adicionados antes das declara\u00e7\u00f5es a que se referem. Veja os seguintes exemplos da RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\nclass Foo\n{\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic const FOO = 'foo';\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic $x;\n\n\t&lt;&lt;ExampleAttribute&gt;&gt;\n\tpublic function foo(&lt;&lt;ExampleAttribute&gt;&gt; $bar) { }\n}\n\n$object = new &lt;&lt;ExampleAttribute&gt;&gt; class () { };\n\n&lt;&lt;ExampleAttribute&gt;&gt;\nfunction f1() { }\n\n$f2 = &lt;&lt;ExampleAttribute&gt;&gt; function () { };\n\n$f3 = &lt;&lt;ExampleAttribute&gt;&gt; fn () =&gt; 1;<\/code><\/pre>\n<p>Atributos podem ser adicionados antes ou depois de um coment\u00e1rio em bloco de documentos:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;ExampleAttribute&gt;&gt;\n\/** docblock *\/\n&lt;&lt;AnotherExampleAttribute&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Cada declara\u00e7\u00e3o pode ter um ou mais atributos, e cada atributo pode ter um ou mais valores associados:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;WithoutArgument&gt;&gt;\n&lt;&lt;SingleArgument(0)&gt;&gt;\n&lt;&lt;FewArguments('Hello', 'World')&gt;&gt;\nfunction foo() {}<\/code><\/pre>\n<p>Veja a <a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\">RFC<\/a> para uma vis\u00e3o mais profunda dos atributos PHP, casos de uso e sintaxe alternativa.<\/p>\n<h3 id=\"named-arguments\">Argumentos nomeados<\/h3>\n<p>Os <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">argumentos nomeados<\/a> fornecem uma nova maneira de passar argumentos para uma fun\u00e7\u00e3o em PHP:<\/p>\n<blockquote><p>Os argumentos nomeados permitem passar argumentos para uma fun\u00e7\u00e3o com base no nome do par\u00e2metro, ao inv\u00e9s da posi\u00e7\u00e3o do par\u00e2metro.<\/p><\/blockquote>\n<p>N\u00f3s podemos passar argumentos nomeados para uma fun\u00e7\u00e3o simplesmente adicionando o nome do par\u00e2metro antes de seu valor:<\/p>\n<pre><code class=\"language-php\">callFunction(name: $value);<\/code><\/pre>\n<p>N\u00f3s tamb\u00e9m podemos usar palavras-chave reservadas, como mostrado no exemplo abaixo:<\/p>\n<pre><code class=\"language-php\">callFunction(array: $value);<\/code><\/pre>\n<p>Mas n\u00f3s n\u00e3o temos permiss\u00e3o para passar um nome de par\u00e2metro dinamicamente. O par\u00e2metro deve ser um identificador, e <strong>a seguinte sintaxe n\u00e3o \u00e9 permitida<\/strong>:<\/p>\n<pre><code class=\"language-php\">callFunction($name: $value);<\/code><\/pre>\n<p>De acordo com Nikita Popov, a autora deste RFC, os argumentos nomeados oferecem v\u00e1rias vantagens.<\/p>\n<p>Em primeiro lugar, argumentos nomeados nos ajudar\u00e3o a escrever um c\u00f3digo mais compreens\u00edvel porque seu significado \u00e9 auto documentar. O exemplo abaixo da RFC \u00e9 autoexplicativo:<\/p>\n<pre><code class=\"language-php\">array_fill(start_index: 0, num: 100, value: 50);<\/code><\/pre>\n<p>Os argumentos indicados s\u00e3o independentes da ordem. Isto significa que n\u00e3o somos for\u00e7ados a passar argumentos para uma fun\u00e7\u00e3o na mesma ordem que a assinatura da fun\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-php\">array_fill(value: 50, num: 100, start_index: 0);<\/code><\/pre>\n<p>Tamb\u00e9m \u00e9 poss\u00edvel combinar argumentos nomeados com argumentos posicionais:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<p>Outra grande vantagem dos argumentos nomeados \u00e9 que eles permitem especificar apenas aqueles argumentos que queremos mudar. N\u00f3s n\u00e3o temos que especificar os argumentos padr\u00e3o se n\u00e3o quisermos sobrescrever os valores padr\u00e3o. O seguinte exemplo da RFC deixa isso claro:<\/p>\n<pre><code class=\"language-php\">htmlspecialchars($string, default, default, false);\n\/\/ vs\nhtmlspecialchars($string, double_encode: false);<\/code><\/pre>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Se voc\u00ea \u00e9 um <a href=\"https:\/\/kinsta.com\/pt\/blog\/contrate-um-desenvolvedor-do-wordpress\/\">desenvolvedor WordPress<\/a>, por favor, note que no momento em que voc\u00ea escreve este texto, os argumentos nomeados podem levar a <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-5-6\/#named-parameters\">problemas de compatibilidade com vers\u00f5es anteriores<\/a>. N\u00e3o os utilize na produ\u00e7\u00e3o sem testes cuidadosos.<\/p>\n<\/aside>\n\n<p>Os argumentos nomeados podem ser usados com <a href=\"#attributes\">atributos PHP<\/a>, como mostrado no exemplo a seguir da RFC:<\/p>\n<pre><code class=\"language-php\">&lt;&lt;MyAttribute('A', b: 'B')&gt;&gt;\nclass Test {}<\/code><\/pre>\n<p>Entretanto, n\u00e3o \u00e9 permitido passar argumentos posicionais ap\u00f3s argumentos nomeados e resultar\u00e1 em um erro de compila\u00e7\u00e3o em tempo de compila\u00e7\u00e3o. O mesmo acontece quando voc\u00ea passa o mesmo nome de par\u00e2metro duas vezes.<\/p>\n<p>Os argumentos nomeados s\u00e3o \u00fateis com declara\u00e7\u00f5es de classe porque os construtores geralmente t\u00eam muitos par\u00e2metros e os argumentos nomeados fornecem uma maneira mais &#8220;ergon\u00f4mica&#8221; de declarar uma classe.<\/p>\n<p>Para uma vis\u00e3o mais pr\u00f3xima em Named Arguments, com restri\u00e7\u00f5es, incompatibilidades para tr\u00e1s, e v\u00e1rios exemplos, veja o <a href=\"https:\/\/wiki.php.net\/rfc\/named_params\">Named Arguments RFC<\/a>.<\/p>\n<h3 id=\"nullsafe-operator\">Operador Nullsafe<\/h3>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">Este RFC<\/a> apresenta o operador nullsafe <code>$-&gt;<\/code> com <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">avalia\u00e7\u00e3o<\/a> completa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Short-circuit_evaluation\">de curto-circuito<\/a>.<\/p>\n<p>Na avalia\u00e7\u00e3o de curto-circuito, o segundo operador s\u00f3 \u00e9 avaliado se o primeiro operador n\u00e3o avaliar para <code>null<\/code>. Se um operador em uma cadeia avalia para <code>null<\/code>, a execu\u00e7\u00e3o de toda a cadeia p\u00e1ra e avalia para <code>null<\/code>.<\/p>\n<p>Considere os seguintes exemplos da RFC:<\/p>\n<pre><code class=\"language-php\">$foo = $a?-&gt;b();<\/code><\/pre>\n<p>Se <code>$a<\/code> \u00e9 nulo, o m\u00e9todo <code>b()<\/code> n\u00e3o \u00e9 chamado e <code>$foo<\/code> est\u00e1 configurado para <code>null<\/code>.<\/p>\n<p>Veja o <a href=\"https:\/\/wiki.php.net\/rfc\/nullsafe_operator\">RFC do operador nullsafe<\/a> para exemplos adicionais, exce\u00e7\u00f5es e escopo futuro.<\/p>\n<h3 id=\"string-to-number-comparison\">Compara\u00e7\u00f5es Saner String to Number<\/h3>\n<p>Em vers\u00f5es anteriores do PHP, ao fazer uma compara\u00e7\u00e3o n\u00e3o restrita entre strings e n\u00fameros, o PHP primeiro lan\u00e7a a string para um n\u00famero, depois faz a compara\u00e7\u00e3o entre n\u00fameros inteiros ou flutuantes. Mesmo que este comportamento seja bastante \u00fatil em v\u00e1rios cen\u00e1rios, ele pode produzir resultados errados que tamb\u00e9m podem levar a bugs e\/ou problemas de seguran\u00e7a.<\/p>\n<p>Considere o seguinte exemplo da RFC:<\/p>\n<pre><code class=\"language-php\">$validValues = [\"foo\", \"bar\", \"baz\"];\n$value = 0;\nvar_dump(in_array($value, $validValues));\n\/\/ bool(true)<\/code><\/pre>\n<p>PHP 8 introduz o <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">Saner string to number comparisons<\/a>, com o objetivo de tornar as compara\u00e7\u00f5es string to number mais razo\u00e1veis. Nas palavras de Nikita Popov,<\/p>\n<blockquote><p>Esta RFC pretende dar \u00e0s compara\u00e7\u00f5es num\u00e9ricas um comportamento mais razo\u00e1vel: Ao comparar com uma cadeia num\u00e9rica, use uma compara\u00e7\u00e3o de n\u00fameros (igual a agora). Caso contr\u00e1rio, converta o n\u00famero para string e use uma compara\u00e7\u00e3o de string.<\/p><\/blockquote>\n<p>A tabela a seguir compara o comportamento da compara\u00e7\u00e3o de strings com a compara\u00e7\u00e3o de n\u00fameros em vers\u00f5es anteriores do PHP e no PHP 8:<\/p>\n<pre>Compara\u00e7\u00e3o | Antes | Depois\n------------------------------\n 0 == \"0\" | true | true\n 0 == \"0.0\"   | true | true | true\n <strong>0 == \"foo\" | true | false\n<\/strong> <strong>0 == \"\"      | verdadeiro | falso<\/strong>\n42 == \" 42\" | true | true\n<strong>42 == \"42foo\" | true | false\n<\/strong><\/pre>\n<p>Leia mais sobre as muitas implica\u00e7\u00f5es desta mudan\u00e7a e como as compara\u00e7\u00f5es de cadeia para n\u00famero mudam no PHP 8 na <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">RFC<\/a> oficial <a href=\"https:\/\/wiki.php.net\/rfc\/string_to_number_comparison\">de Nikita Popov<\/a>.<\/p>\n<h3 id=\"saner-numeric-strings\">Saner Numeric Strings<\/h3>\n<p>No PHP, as strings contendo n\u00fameros se encaixam em <a href=\"https:\/\/github.com\/php\/php-langspec\/blob\/be010b4435e7b0801737bb66b5bbdd8f9fb51dde\/spec\/05-types.md#the-string-type\">tr\u00eas categorias<\/a>:<\/p>\n<ul>\n<li><strong>Numeric strings<\/strong>: strings contendo um n\u00famero opcionalmente precedido por espa\u00e7os em branco.<\/li>\n<li><strong>Leading-numeric string<\/strong>: strings cujos caracteres iniciais s\u00e3o num\u00e9ricos e os caracteres finais s\u00e3o n\u00e3o-num\u00e9ricos.<\/li>\n<li><strong>Non-numeric string<\/strong>: strings que n\u00e3o se enquadram em nenhuma das categorias anteriores.<\/li>\n<\/ul>\n<p>Strings num\u00e9ricas e strings num\u00e9ricas principais s\u00e3o tratadas de forma diferente dependendo da opera\u00e7\u00e3o realizada. Por exemplo, as strings num\u00e9ricas s\u00e3o tratadas de forma diferente dependendo da opera\u00e7\u00e3o realizada:<\/p>\n<ul>\n<li><strong>Convers\u00f5es expl\u00edcitas de cadeia de caracteres para n\u00fameros<\/strong> (isto \u00e9, <code>(int)<\/code> e <code>(float)<\/code> type casts) convertem n\u00fameros de cadeias de caracteres num\u00e9ricas e n\u00e3o-num\u00e9ricas principais. A convers\u00e3o expl\u00edcita de uma cadeia de caracteres n\u00e3o num\u00e9rica para um n\u00famero produz 0.<\/li>\n<li><strong>Convers\u00f5es impl\u00edcitas de string para n\u00famero<\/strong> (ou seja, sem declara\u00e7\u00e3o <code>strict_type<\/code> ) levam a resultados diferentes para strings num\u00e9ricas e n\u00e3o-num\u00e9ricas. As convers\u00f5es n\u00e3o-num\u00e9ricas de cadeia de caracteres para n\u00famero lan\u00e7am um <code>TypeError<\/code>.<\/li>\n<li><code>is_numeric()<\/code> retorna <strong>verdadeiro<\/strong> somente para cadeias de caracteres num\u00e9ricas.<\/li>\n<\/ul>\n<p>Compensa\u00e7\u00f5es de strings, opera\u00e7\u00f5es aritm\u00e9ticas, opera\u00e7\u00f5es de incremento e decremento, compara\u00e7\u00f5es de strings com strings, e opera\u00e7\u00f5es bitwise tamb\u00e9m levam a resultados diferentes.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">Esta RFC<\/a> se prop\u00f5e a isso:<\/p>\n<blockquote><p>Unificar os v\u00e1rios modos de strings num\u00e9ricas em um \u00fanico conceito: Caracteres num\u00e9ricos somente com espa\u00e7o em branco permitido, tanto com espa\u00e7o em branco principal quanto com o trailing. Qualquer outro tipo de string \u00e9 n\u00e3o-num\u00e9rico e lan\u00e7ar\u00e1 TypeErrors quando usado em um contexto num\u00e9rico.<\/p><\/blockquote>\n<blockquote><p>Isto significa que todas as strings que atualmente emitem o <strong>E_NOTICE<\/strong> &#8220;A non well formed numeric value encountered&#8221; ser\u00e3o reclassificadas no <strong>E_WARNING<\/strong> &#8220;A non-numeric value encountered&#8221;, exceto se a string num\u00e9rica principal contivesse apenas espa\u00e7os em branco. E os v\u00e1rios casos que atualmente emitem um <strong>AVISO E_WARNING<\/strong> ser\u00e3o promovidos para <code>TypeError<\/code>s<\/p><\/blockquote>\n<p>.<br \/>\nPara uma vis\u00e3o mais profunda das strings num\u00e9ricas no PHP 8, com exemplos de c\u00f3digo, exce\u00e7\u00f5es e problemas de compatibilidade retroativa, veja a <a href=\"https:\/\/wiki.php.net\/rfc\/saner-numeric-strings\">RFC<\/a>.<\/p>\n<h3 id=\"match-expression\">Express\u00e3o Match v2<\/h3>\n<p>A nova express\u00e3o <code>match<\/code> \u00e9 bem parecida com <code>switch<\/code> mas com uma sem\u00e2ntica mais segura e permitindo retornar valores.<\/p>\n<p>Para entender a diferen\u00e7a entre as duas estruturas de controle, considere o seguinte exemplo <code>switch<\/code> da <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">RFC<\/a>:<\/p>\n<pre><code class=\"language-php\">switch (1) {\n\tcase 0:\n\t\t$result = 'Foo';\n\t\tbreak;\n\tcase 1:\n\t\t$result = 'Bar';\n\t\tbreak;\n\tcase 2:\n\t\t$result = 'Baz';\n\t\tbreak;\n}\n \necho $result;\n\/\/&gt; Bar<\/code><\/pre>\n<p>Agora podemos obter o mesmo resultado que o c\u00f3digo acima com a seguinte express\u00e3o <code>match<\/code>:<\/p>\n<pre><code class=\"language-php\">echo match (1) {\n\t0 =&gt; 'Foo',\n\t1 =&gt; 'Bar',\n\t2 =&gt; 'Baz',\n};\n\/\/&gt; Bar<\/code><\/pre>\n<p>Uma vantagem significativa de usar a nova express\u00e3o <code>match<\/code> \u00e9 que enquanto <code>switch<\/code> compara valores vagamente (<code>==<\/code>) potencialmente levando a resultados inesperados, com <code>match<\/code> a compara\u00e7\u00e3o \u00e9 uma verifica\u00e7\u00e3o de identidade (<code>===<\/code>).<\/p>\n<p>A express\u00e3o <code>match<\/code> tamb\u00e9m pode conter m\u00faltiplas express\u00f5es separadas por v\u00edrgula, permitindo uma sintaxe (<a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">fonte<\/a>) mais concisa:<\/p>\n<pre><code class=\"language-php\">$result = match ($x) {\n\t\/\/ This match arm:\n\t$a, $b, $c =&gt; 5,\n\t\/\/ Is equivalent to these three match arms:\n\t$a =&gt; 5,\n\t$b =&gt; 5,\n\t$c =&gt; 5,\n};<\/code><\/pre>\n<p>Para exemplos e casos de uso adicionais, veja a <a href=\"https:\/\/wiki.php.net\/rfc\/match_expression_v2\">express\u00e3o Match v2 RFC<\/a> e a <a href=\"https:\/\/www.php.net\/manual\/en\/control-structures.match.php\">documenta\u00e7\u00e3o PHP<\/a>.<\/p>\n<h3 id=\"arithmetic-bitwise-operators\">Verifica\u00e7\u00f5es mais r\u00edgidas do tipo para operadores aritm\u00e9ticos\/bitswise<\/h3>\n<p>Nas vers\u00f5es anteriores do PHP, o aplicativo de operadores <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.arithmetic.php\">aritm\u00e9ticos<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.bitwise.php\">bitwise<\/a> a um array, recurso, ou objeto n\u00e3o sobrecarregado era permitida. De qualquer forma, o comportamento \u00e0s vezes era inconsistente.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks\">Neste RFC<\/a>, Nikita Popov mostra como esse comportamento pode ser irracional com um simples exemplo:<\/p>\n<pre><code class=\"language-php\">var_dump([] % [42]);\n\/\/ int(0)<\/code><\/pre>\n<p>Nikita explica como o aplicativo do operador aritm\u00e9tico ou bitwise a arrays, recursos ou objetos n\u00e3o sobrecarregados <a href=\"https:\/\/wiki.php.net\/rfc\/arithmetic_operator_type_checks#current_behavior\">levou a resultados diferentes<\/a>:<\/p>\n<blockquote><p>Operadores +, -, *, \/, **:<\/p>\n<ul>\n<li>Exce\u00e7\u00e3o de erro no operando de array. (Excluindo + se ambos os operandos forem array)<\/li>\n<li>Converta silenciosamente um operando de recurso para o ID do recurso como um n\u00famero inteiro.<\/li>\n<li>Converta um operando objeto para um inteiro, enquanto lan\u00e7a um aviso.<\/li>\n<\/ul>\n<p>Operadores %, &lt;&lt;, &gt;&gt;, &#038;, |, ^:<\/p>\n<ul>\n<li>Converta silenciosamente um operando de array para zero inteiro se vazio ou um inteiro se n\u00e3o vazio.<\/li>\n<li>Converta silenciosamente um operando de recurso para o ID do recurso como um n\u00famero inteiro.<\/li>\n<li>Converta um operando de objeto para um inteiro, enquanto lan\u00e7a um aviso.<\/li>\n<\/ul>\n<p>Operador ~:<\/p>\n<ul>\n<li>Lance uma exce\u00e7\u00e3o de erro para a array, resource e object operands.<\/li>\n<\/ul>\n<p>Operadores ++ e &#8211;:<\/p>\n<ul>\n<li>Silenciosamente n\u00e3o fa\u00e7a nada se o operando for um array, recurso ou objeto.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Com o PHP 8, as coisas mudam, e o comportamento \u00e9 o mesmo para todos os operadores aritm\u00e9ticos e bitwise:<\/p>\n<p><strong>Lance uma exce\u00e7\u00e3o <code>TypeError<\/code> para a array, resource, e object operands.<\/strong><\/p>\n<h2 id=\"new-php-functions\">Novas fun\u00e7\u00f5es do PHP<\/h2>\n<p>O PHP 8 traz v\u00e1rias novas fun\u00e7\u00f5es para a linguagem:<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3 id=\"str_contains\" class=\"has-anchor-hash\">str_contains<\/h3>\n<p>Antes do PHP 8, <a href=\"https:\/\/www.php.net\/manual\/en\/function.strstr.php\">strstr<\/a> e <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php\">strpos<\/a> eram as op\u00e7\u00f5es t\u00edpicas para os <a href=\"https:\/\/kinsta.com\/pt\/blog\/contrate-um-desenvolvedor-do-wordpress\/\">desenvolvedores<\/a> procurarem por uma agulha dentro de uma determinada string. O problema \u00e9 que ambas as fun\u00e7\u00f5es n\u00e3o s\u00e3o consideradas muito intuitivas, e seu uso pode ser confuso para novos desenvolvedores de PHP. Veja o exemplo a seguir:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme = 'WordPress';\n$pos = strpos($mystring, $findme);\n\nif ($pos !== false) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>No exemplo acima, n\u00f3s usamos o operador de compara\u00e7\u00e3o <code>!==<\/code>, que verifica se dois valores s\u00e3o do mesmo tipo. Isto nos impede de obter um erro <a href=\"https:\/\/www.php.net\/manual\/en\/function.strpos.php#refsect1-function.strpos-returnvalues\">se a posi\u00e7\u00e3o da agulha for 0<\/a>:<\/p>\n<blockquote><p>&#8220;Esta fun\u00e7\u00e3o pode retornar <strong>FALSE<\/strong> Booleano, mas tamb\u00e9m pode retornar um valor n\u00e3o-Booleano que avalia para <strong>FALSE<\/strong><\/p><\/blockquote>\n<p>&#8220;. [&#8230;] Use o operador === para testar o valor de retorno desta fun\u00e7\u00e3o&#8221;<br \/>\nAl\u00e9m disso, v\u00e1rias estruturas fornecem fun\u00e7\u00f5es de ajuda para buscar um valor dentro de uma determinada string (veja a <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-str-contains\">documenta\u00e7\u00e3o do Laravel Helpers<\/a> como exemplo).<\/p>\n<p>Agora, <a href=\"https:\/\/wiki.php.net\/rfc\/str_contains\">este RFC<\/a> prop\u00f5e a introdu\u00e7\u00e3o de uma nova fun\u00e7\u00e3o que permite pesquisar dentro de uma string: <code>str_contains<\/code>.<\/p>\n<pre><code class=\"language-php\">str_contains ( string $haystack , string $needle ) : bool<\/code><\/pre>\n<p>Seu uso \u00e9 bastante simples. <code>str_contains<\/code> verifica se <code>$needle<\/code> \u00e9 encontrado em <code>$haystack<\/code> e retorna <code>true<\/code> ou <code>false<\/code> de acordo.<\/p>\n<p>Ent\u00e3o, gra\u00e7as a <code>str_contains<\/code>, podemos escrever o seguinte c\u00f3digo:<\/p>\n<pre><code class=\"language-php\">$mystring = 'Managed WordPress Hosting';\n$findme   = 'WordPress';\n\nif (str_contains($mystring, $findme)) {\n\techo \"The string has been found\";\n} else {\n\techo \"String not found\";\n}<\/code><\/pre>\n<p>O que \u00e9 mais leg\u00edvel e menos propenso a erros (veja este c\u00f3digo em a\u00e7\u00e3o <a href=\"https:\/\/3v4l.org\/rcmEq\/rfc#git-php-master\">aqui<\/a>).<br \/>\nNo momento em que escrevemos este artigo, <code>str_contains<\/code> \u00e9 sens\u00edvel a casos, mas isto pode mudar no futuro.<\/p>\n<p>A proposta <code>str_contains<\/code> foi aprovada com 43 a 9 votos.<\/p>\n<h3 id=\"str_starts_with-and-str_ends_with\">str_starts_with() e str_ends_with()<\/h3>\n<p>Al\u00e9m da fun\u00e7\u00e3o <code>str_contains<\/code>, duas novas fun\u00e7\u00f5es permitem a busca por uma agulha dentro de uma determinada corda: <code>str_starts_with<\/code> e <code>str_ends_with<\/code>.<\/p>\n<p><a href=\"https:\/\/wiki.php.net\/rfc\/add_str_starts_with_and_ends_with_functions\">Estas novas fun\u00e7\u00f5es<\/a> verificam se uma determinada string come\u00e7a ou termina com outra string:<\/p>\n<pre><code class=\"language-php\">str_starts_with (string $haystack , string $needle) : bool\nstr_ends_with (string $haystack , string $needle) : bool<\/code><\/pre>\n<p>Ambas as fun\u00e7\u00f5es retornam <code>false<\/code> se <code>$needle<\/code> for mais longo que <code>$haystack<\/code>.<\/p>\n<p>De acordo com Will Hudgins, o autor deste RFC,<\/p>\n<blockquote><p>&#8220;A funcionalidade <code>str_starts_with<\/code> e <code>str_ends_with<\/code> \u00e9 t\u00e3o comumente necess\u00e1ria que muitos dos <a href=\"https:\/\/kinsta.com\/pt\/blog\/frameworks-php-populares\/\">principais frameworks PHP<\/a> a suportam, incluindo <a href=\"https:\/\/symfony.com\/doc\/5.0\/components\/string.html#methods-to-search-and-replace\">Symfony<\/a>, <a href=\"https:\/\/laravel.com\/docs\/7.x\/helpers#method-starts-with\">Laravel<\/a>, <a href=\"https:\/\/www.yiiframework.com\/doc\/api\/2.0\/yii-helpers-basestringhelper#startsWith()-detail\">Yii<\/a>, <a href=\"https:\/\/fuelphp.com\/docs\/classes\/str.html#\/method_starts_with\">FuelPHP<\/a>, e <a href=\"https:\/\/docs.phalcon.io\/3.4\/en\/api\/phalcon_text\">Phalcon<\/a><span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\">&#8220;<\/span><\/p><\/blockquote>\n<p>Gra\u00e7as a eles, agora poder\u00edamos evitar o uso de fun\u00e7\u00f5es sub-\u00f3timas e menos intuitivas como <code>substr<\/code>, <code>strpos<\/code>. Ambas as fun\u00e7\u00f5es s\u00e3o sens\u00edveis a mai\u00fasculas e min\u00fasculas:<\/p>\n<pre><code class=\"language-php\">$str = \"WordPress\";\nif (str_starts_with($str, \"Word\")) echo \"Found!\";\n\nif (str_starts_with($str, \"word\")) echo \"Not found!\";<\/code><\/pre>\n<p>Voc\u00ea pode ver este c\u00f3digo em a\u00e7\u00e3o <a href=\"https:\/\/3v4l.org\/kBcjZ\/rfc#output\">aqui<\/a>.<\/p>\n<p>Esta RFC foi aprovada com 51 a 4 votos.<\/p>\n<h3 id=\"get_debug_type\">get_debug_type<\/h3>\n<p><code>get_debug_type<\/code> \u00e9 <a href=\"https:\/\/wiki.php.net\/rfc\/get_debug_type\">uma nova fun\u00e7\u00e3o PHP<\/a> que retorna o tipo de uma vari\u00e1vel. A nova fun\u00e7\u00e3o funciona de forma bastante similar \u00e0 <a href=\"https:\/\/www.php.net\/manual\/en\/function.gettype.php\">fun\u00e7\u00e3o<code>gettype<\/code> <\/a>, mas <code>get_debug_type<\/code> retorna nomes de tipos nativos e resolve nomes de classes.<\/p>\n<p>Isso \u00e9 uma boa melhoria para o idioma, j\u00e1 que <code>gettype()<\/code> n\u00e3o \u00e9 \u00fatil para a verifica\u00e7\u00e3o de tipo.<\/p>\n<p>O RFC fornece dois exemplos \u00fateis para entender a diferen\u00e7a entre a nova fun\u00e7\u00e3o <code>get_debug_type()<\/code> e <code>gettype()<\/code>. O primeiro exemplo mostra <code>gettype<\/code> no trabalho:<\/p>\n<pre><code class=\"language-php\">$bar = [1,2,3];\n\nif (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ', got ' . (is_object($bar) ? get_class($bar) : gettype($bar)));\n}<\/code><\/pre>\n<p>Com o PHP 8, n\u00f3s poder\u00edamos usar <code>get_debug_type<\/code>, ao inv\u00e9s disso:<\/p>\n<pre><code class=\"language-php\">if (!($bar instanceof Foo)) { \n\tthrow new TypeError('Expected ' . Foo::class . ' got ' . get_debug_type($bar));\n}<\/code><\/pre>\n<p>A tabela seguinte mostra os valores de retorno de <code>get_debug_type<\/code> e <code>gettype<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th>Value<\/th>\n<th>gettype()<\/th>\n<th>get_debug_type()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>integer<\/td>\n<td>int<\/td>\n<\/tr>\n<tr>\n<td>0.1<\/td>\n<td>double<\/td>\n<td>float<\/td>\n<\/tr>\n<tr>\n<td>true<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>false<\/td>\n<td>boolean<\/td>\n<td>bool<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>NULL<\/td>\n<td>null<\/td>\n<\/tr>\n<tr>\n<td>&#8220;WordPress&#8221;<\/td>\n<td>string<\/td>\n<td>string<\/td>\n<\/tr>\n<tr>\n<td>[1,2,3]<\/td>\n<td>array<\/td>\n<td>array<\/td>\n<\/tr>\n<tr>\n<td>A class with name &#8220;Foo\\Bar&#8221;<\/td>\n<td>object<\/td>\n<td>Foo\\Bar<\/td>\n<\/tr>\n<tr>\n<td>An anonymous class<\/td>\n<td>object<\/td>\n<td>class@anonymous<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"additional-rfcs\">RFCs adicionais<br \/>\n<span style=\"color: #8c8271;font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1.125rem;font-weight: 300\" data-darkreader-inline-color>Aqui est\u00e1 uma lista r\u00e1pida de melhorias adicionais aprovadas que v\u00eam com o PHP 8:<\/span><\/h2>\n<ol>\n<li><strong>Interface Stringable<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/stringable\">esta RFC<\/a> introduz uma interface Stringable que \u00e9 automaticamente adicionada \u00e0s classes que implementam o <a href=\"https:\/\/www.php.net\/manual\/en\/language.oop5.magic.php#object.tostring\">m\u00e9todo<code>__to String()<\/code> <\/a>. O principal objetivo aqui \u00e9 usar o tipo de uni\u00e3o <code>string|Stringable<\/code>.<\/li>\n<li><strong>Novas APIs DOM Living Standard em ext\/dom<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/dom_living_standard_api\">esta RFC<\/a> prop\u00f5e implementar o <a href=\"https:\/\/dom.spec.whatwg.org\/\">DOM Living Standard<\/a> atual para a <a href=\"https:\/\/www.php.net\/manual\/en\/intro.dom.php\">extens\u00e3o PHP DOM<\/a>, introduzindo novas interfaces e propriedades p\u00fablicas.<\/li>\n<li><strong>Tipo de retorno est\u00e1tico<\/strong>: O PHP 8 introduz o uso do <code>static<\/code> como tipo de retorno ao lado dos tipos <code>self<\/code> e <code>parent<\/code>.<\/li>\n<li><strong>Ajustes de sintaxe vari\u00e1vel<\/strong>: <a href=\"https:\/\/wiki.php.net\/rfc\/variable_syntax_tweaks\">esta RFC<\/a> resolve algumas inconsist\u00eancias residuais na sintaxe vari\u00e1vel do PHP.<\/li>\n<\/ol>\n<h2>Desempenho do PHP 8: Benchmarks<\/h2>\n<p>Se voc\u00ea est\u00e1 se perguntando qu\u00e3o r\u00e1pido \u00e9 o PHP 8, temos a resposta. <a href=\"https:\/\/kinsta.com\/pt\/blog\/benchmarks-definitivos-do-php\/\">Realizamos benchmarks em 20 plataformas\/configura\u00e7\u00f5es<\/a> de PHP em 7 vers\u00f5es diferentes do PHP (5.6, 7.0, 7.1, 7.2, 7.3 e 8.0).<\/p>\n<p>O PHP 8.0 se destacou como o vencedor na maioria das plataformas que o suportam, incluindo <a href=\"https:\/\/kinsta.com\/pt\/blog\/laravel-vs-wordpress\/\">WordPress e Laravel<\/a>.<\/p>\n<figure id=\"attachment_88757\" aria-describedby=\"caption-attachment-88757\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-88757 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/02\/Kinsta-PHP-Benchmarks-2021-Compilation.png\" alt=\"Benchmarks compilados das principais plataformas de PHP\" width=\"1100\" height=\"799\"><figcaption id=\"caption-attachment-88757\" class=\"wp-caption-text\">Benchmarks compilados das principais plataformas de PHP<\/figcaption><\/figure>\n<p>Por exemplo, o WordPress no PHP 8.0 pode lidar com <strong>18,4%<\/strong> mais solicita\u00e7\u00f5es por segundo do que o PHP 7.4. Da mesma forma, o Laravel no PHP 8.0 pode executar <strong>8,5%<\/strong> mais solicita\u00e7\u00f5es por segundo do que o PHP 7.3.<\/p>\n<p>Se o seu site ou aplicativo \u00e9 totalmente compat\u00edvel com o PHP 8.0, voc\u00ea deve planejar <a href=\"https:\/\/kinsta.com\/pt\/changelog\/php-8\/\">atualizar o ambiente do seu servidor para o PHP 8.0<\/a> o mais r\u00e1pido poss\u00edvel. Voc\u00ea (e seus usu\u00e1rios) com certeza v\u00e3o apreciar os benef\u00edcios de desempenho. No entanto, teste seu site completamente antes de atualizar.<\/p>\n<p>Voc\u00ea pode ler nosso <a href=\"https:\/\/kinsta.com\/pt\/blog\/benchmarks-definitivos-do-php\/\">artigo sobre benchmarks de PHP<\/a> para obter mais informa\u00e7\u00f5es, como dados de desempenho detalhados, percep\u00e7\u00f5es e gr\u00e1ficos interessantes!<\/p>\n<p><span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\"><\/span><\/p>\n<h2>Resumo<\/h2>\n<p>Que passeio! Neste artigo, cobrimos as otimiza\u00e7\u00f5es e caracter\u00edsticas mais interessantes que v\u00eam com o PHP 8. O mais esperado certamente \u00e9 o compilador Just in Time, mas h\u00e1 muito mais com o PHP 8.<\/p>\n<p>Certifique-se de marcar este artigo no blog para sua refer\u00eancia futura. \ud83e\udd13<\/p>\n<p>Agora \u00e9 a sua vez: voc\u00ea est\u00e1 pronto para testar as novas funcionalidades do PHP? Qual delas \u00e9 a sua favorita? Escreva nos coment\u00e1rios abaixo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O PHP 8 foi oficialmente lan\u00e7ado para o General Availability em 26 de novembro de 2020! Esta nova grande atualiza\u00e7\u00e3o traz muitas otimiza\u00e7\u00f5es e funcionalidades poderosas &#8230;<\/p>\n","protected":false},"author":36,"featured_media":37388,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[32,44],"topic":[998],"class_list":["post-37383","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php","tag-webdev","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 (Caracter\u00edsticas, Melhorias e o Compilador JIT)<\/title>\n<meta name=\"description\" content=\"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\" \/>\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 (Caracter\u00edsticas, Melhorias e o Compilador JIT)\" \/>\n<meta property=\"og:description\" content=\"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\" \/>\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=\"2020-05-26T14:01:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-05T08:14:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"30 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\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)\",\"datePublished\":\"2020-05-26T14:01:56+00:00\",\"dateModified\":\"2023-09-05T08:14:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\"},\"wordCount\":6083,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\",\"keywords\":[\"php\",\"webdev\"],\"articleSection\":[\"Desenvolvimento WordPress\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\",\"name\":\"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\",\"datePublished\":\"2020-05-26T14:01:56+00:00\",\"dateModified\":\"2023-09-05T08:14:17+00:00\",\"description\":\"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/php-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg\",\"width\":1024,\"height\":512,\"caption\":\"O que h\u00e1 de novo no PHP 8 (funcionalidades, melhorias e o compilador JIT)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/php-8\/#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 (Caracter\u00edsticas, Melhorias e o Compilador JIT)\"}]},{\"@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\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)","description":"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/php-8\/","og_locale":"pt_PT","og_type":"article","og_title":"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)","og_description":"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!","og_url":"https:\/\/kinsta.com\/pt\/blog\/php-8\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2020-05-26T14:01:56+00:00","article_modified_time":"2023-09-05T08:14:17+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","type":"image\/jpeg"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Carlo Daniele","Tempo estimado de leitura":"30 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)","datePublished":"2020-05-26T14:01:56+00:00","dateModified":"2023-09-05T08:14:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/"},"wordCount":6083,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","keywords":["php","webdev"],"articleSection":["Desenvolvimento WordPress"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/php-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/","url":"https:\/\/kinsta.com\/pt\/blog\/php-8\/","name":"O Que H\u00e1 de Novo no PHP 8 (Caracter\u00edsticas, Melhorias e o Compilador JIT)","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","datePublished":"2020-05-26T14:01:56+00:00","dateModified":"2023-09-05T08:14:17+00:00","description":"O PHP 8 est\u00e1 previsto para ser lan\u00e7ado no dia 03 de dezembro de 2020. Ele trar\u00e1 novas caracter\u00edsticas, deprecia\u00e7\u00f5es e aumento de desempenho. Veja o que h\u00e1 de novo no PHP 8!","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/php-8\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2020\/05\/novo-php8-pt.jpg","width":1024,"height":512,"caption":"O que h\u00e1 de novo no PHP 8 (funcionalidades, melhorias e o compilador JIT)"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/php-8\/#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 (Caracter\u00edsticas, Melhorias e o Compilador JIT)"}]},{"@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\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37383","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\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=37383"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37383\/revisions"}],"predecessor-version":[{"id":62806,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/37383\/revisions\/62806"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/en"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/pt"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/nl"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/translations\/se"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/37383\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/37388"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=37383"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=37383"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=37383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}