PHP 8.2: Novos Recursos, Depreciações e Correções de Erros
O PHP 8.2 chegou. Mais especificamente em 24 de novembro.
O PHP 8.2 veio para facilitar a vida dos desenvolvedores. A maioria das alterações simplifica o processo de codificação e deprecia algumas das funções mais antigas. Atualize para a versão mais recente do PHP para maximizar a segurança do seu site e se acostumar com a nova sintaxe.
Confira agora todas as mudanças que o PHP 8.2 trouxe e decida se vale a pena atualizar para a nova versão.
Novos Recursos do PHP 8.2
Nesta seção, veremos as mudanças e os novos recursos do PHP 8.2.
Nova Classe de Propriedade Somente Leitura (readonly)
A nova classe “readonly” foi lançada na versão 8.1. O PHP 8.2 a melhorou ainda mais. Agora, você pode declarar uma classe inteira como sendo somente leitura. Isso muda todas as propriedades dessa classe para somente leitura. Essa classe não funciona para propriedades dinâmicas – se classificá-las como somente leitura, um erro vai aparecer.
Confira como era a declaração de classe antes:
class ReadOnlyClass { public readonly int $number, public readonly int $anotherNumber } Com o PHP 8.2, o processo ficou mais simples: class ReadOnlyClass { public int $number, public int $anotherNumber }
Tenha em mente que não será possível declarar os seguintes recursos do PHP:
- Enums – pois eles não podem conter propriedades.
- Traits
- Interfaces
Permitir true, null e false como Tipos Autônomos
Os usuários do PHP 8.0 receberam suporte para Union Types (Tipos de União). Você pode declarar um tipo como uma união de dois ou mais tipos. Mesmo que antes você pudesse usar false e null como parte de um tipo, não era permitido usá-los como tipos autônomos.
Com o PHP 8.2, isso se tornou possível. Com esta adição, o sistema de tipos do PHP será mais descritivo, pois você poderá declarar os tipos de retorno, parâmetro e propriedade com mais precisão.
Redução de Valor de Parâmetro Sensível
O PHP permite que os usuários rastreiem a pilha de chamadas em qualquer ponto do código. O rastreamento é útil para depurar um aplicativo e ver por que ele falhou. No entanto, alguns rastreamentos de pilha podem conter informações confidenciais que devem ser escondidas.
O PHP 8.2 adicionou um novo atributo chamado “SensitiveParameter”. Ele evita que informações confidenciais sejam exibidas ou registradas quando um aplicativo apresenta problemas. Veja o exemplo a seguir:
function passwords( $publicpassword, #[\SensitiveParameter] $secretpassword ) { throw new \Exception('Error'); } passwords('publicpassword', 'secretpassword');
Nova Função mysqli_execute_query e Método mysqli::execute_query
O PHP 8.2 trouxe uma maneira mais fácil de lidar com consultas MySQLi parametrizadas. Com a função mysqli_execute_query($sql, $params) e o método mysqli::execute_query, você pode preparar, vincular e executar consultas dentro da mesma função. Após executar uma consulta com sucesso, ela retornará o objeto mysqli_result.
A proposta da RFC (inglês) fica assim:
foreach ($db->execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) { print_r($row); }
Permitir Constantes em Traits
Com o PHP 8.2, você consegue declarar constantes em traits. Antes, os códigos traits permitiam que os usuários reutilizassem o código definindo métodos e propriedades.
Confira um exemplo oficial de proposta RFC (inglês):
trait Foo { public const FLAG_1 = 1; protected const FLAG_2 = 2; private const FLAG_3 = 2; public function doFoo(int $flags): void { if ($flags & self::FLAG_1) { echo 'Got flag 1'; } if ($flags & self::FLAG_2) { echo 'Got flag 2'; } if ($flags & self::FLAG_3) { echo 'Got flag 3'; } } }
Novos Tipos Disjunctive Normal Form (DNF)
Com o PHP 8.2, você poderá usar um novo recurso de tipos Disjunctive Normal Form (DNF). Ele é uma forma padronizada de organizar expressões booleanas. Esse recurso consiste em uma disjunção de conjunções ou em termos booleanos é um OR booleano de ANDs.
Confira um exemplo de proposta RFC (inglês) abaixo:
// Accepts an object that implements A and B // OR an object that implements D. (A&B)|D // Accepts an object that implements C, // OR a child of X that also implements D, // OR null. C|(X&D)|null // Accepts an object that implements all three of A, B, and D, // OR an int, // OR null. (A&B&D)|int|null
Atributo AllowDynamicProperties
O PHP 8.2 depreciou variáveis dinâmicas em classes. Isso resulta em uma mensagem de descontinuação do PHP 8.2 e “ErrorException” em versões futuras do PHP.
Por esta razão, um novo atributo #[AllowDynamicProperties] será adicionado ao PHP 8.2 para permitir propriedades dinâmicas nas classes. Confira um exemplo de RFC (inglês) a seguir:
class Foo {} $foo = new Foo; // Deprecated: Creation of dynamic property Foo::$bar is deprecated $foo->bar = 1; // No deprecation warning: Dynamic property already exists. $foo->bar = 2;
Recursos Obsoletos do PHP 8.2
Nesta seção, veremos todos os recursos descontinuados do PHP 8.2.
Funções #utf8_encode() and utf8_decode()
As funções utf8_encode() e utf8_decode() são usadas para converter entre os padrões de codificação ISO-8859-1 e UTF-8. Como essas funções apresentam mensagens de erro, avisos e suporte de codificação limitados, o PHP 8.2 irá depreciá-las. Já o PHP 9.0 vai excluí-las completamente. Como alternativa, os usuários poderão usar as extensões iconv ou intl para converter o padrão de codificação.
Mbstring: Base64, Uuencode, QPrint e Codificações de Entidades HTML
As funções Mbstring são usadas para converter vários padrões de codificação de caracteres, como UTF-8/16/32 e ISO-8859-1. Elas também incluem suporte para Base64, Quoted-Printable, Uuencode e entidades HTML.
No entanto, esses formatos processam informações em bytes brutos em vez de em uma sequência de bytes. Também é importante notar que o PHP já possui funções separadas para codificar/decodificar esses formatos. Assim, o PHP 8.2 irá depreciar a extensão mbstring com as seguintes codificações rotuladas:
- BASE64
- UUENCODE
- HTML-ENTITIES
- html (aliás de HTML-ENTITIES)
- Citação-Printable
- qprint (aliás de Quoted-Printable)
Callables com Suporte Parcial
O PHP 8.2 irá depreciar callables parcialmente suportados que não funcionam com o padrão $callable(). Confira a lista de callables depreciados abaixo:
$callable = "self::method"; $callable ="parent::method"; $callable = "static::method"; $callable = "static::method"; $callable = ["parent", "method"]; $callable = ["static", "method"]; $callable = ["MyClass", "MyParentClass::myMethod"]; $callable = [new MyClass(), "MyOtherClass::myMethod"];
Para evitar a mensagem de descontinuação, os usuários podem converter todas as palavras-chave self, parent e static em seus nomes de classe correspondentes.
Interpolação de Strings ${var}
O PHP permite que os usuários substituam valores de variáveis dentro de uma string literal com aspas duplas, como nos exemplos a seguir:
- “$myname” – incorporando variáveis diretamente.
- “{$myname}” – chaves fora da variável.
- “${myname}” – colchetes após o cifrão.
- ” ${expr}” – variáveis equivalentes a (string) ${expr}
Embora ofereçam a mesma funcionalidade, a sintaxe das duas últimas opções é mais complexa. É por esse motivo que elas serão descontinuadas no PHP 8.2. As duas primeiras opções ainda poderão ser usadas.
Outras Mudanças do PHP 8.2
Melhoria da Extensão Aleatória
O PHP oferece várias funções para geração de números aleatórios. Com o PHP 8.2, alguns desses números serão movidos para uma nova extensão aleatória. Essa extensão será incluída no PHP por padrão e não haverá opção para desativá-la.
Confira a lista de todas as funções e constantes que serão movidas para a extensão aleatória. Tenha em mente que eles permanecerão no namespace global.
- função random_bytes
- função random_int
- função rand
- função getrandmax
- função srand
- função lcg_value
- função mt_rand
- função mt_getrandmax
- função mt_srand
- Constante MT_RAND_PHP
- constante MT_RAND_MT19937
Suporte libmysql Removido para MySQLi
O PHP suportava duas bibliotecas que conectavam bancos de dados MySQL: mysqlnd e libmysql. Desde o PHP 5.4, a biblioteca padrão recomendada é a mysqlnd. Para simplificar o teste de código PHP, o libmysql foi removido no PHP 8.2.
A partir de agora, a biblioteca mysqlnd precisa ser usada para conectar bancos de dados MySQL.
Mudanças na Ordem de Classificação para a Função ksort
A função ksort classifica um array por chave em ordem crescente. O PHP 8.2 introduziu uma correção de erro para tornar a saída do parâmetro “SORT_REGULAR” consistente com os outros parâmetros. Até o PHP 8.2, as teclas alfabéticas vinham antes das numéricas.
Agora, o ksort dispõe as teclas numéricas antes das teclas alfabéticas ao classificar. Na prática, as chaves classificadas ficarão assim:
["1" => '', "2" => '', "a" => '', , "b" => ''];
Em vez de:
["a" => '', "b" => '', "1" => '', , "2" => ''];
Função str_split Retorna Matrizes Vazias para Strings Vazias
Outra correção de erro é para a função str_split. Ele é usado para dividir uma string em uma matriz.
Antes do PHP 8.2, se esta função recebesse uma string vazia, ela também retornaria uma string vazia. Agora, o PHP 8.2 apresenta uma correção para esse erro, e a função str_split retorna uma matriz vazia se for fornecida uma string vazia.
Como Alterar a Versão do PHP
É comum que os provedores de hospedagem ofereçam uma maneira simples de alternar entre as versões do PHP. Se você estiver usando o hPanel da Hostinger, basta selecionar seu plano de hospedagem e procurar por Configuração PHP:
Aqui, você encontra todas as últimas versões estáveis do PHP. Selecione a versão que você deseja e clique em Atualizar para salvar as alterações.
Você também pode gerenciar extensões PHP e opções PHP para todas as versões individualmente em nosso hPanel.
Conclusão
O PHP 8.2 oferece muitas melhorias em relação às versões anteriores. Ele apresenta uma série de novos recursos, como novas classes “somente leitura”, deprecia várias implementações desatualizadas com sintaxe complexa e corrige erros que simplificam o fluxo de trabalho de desenvolvimento e tornam o uso do PHP mais fácil.
Esperamos que este artigo tenha ajudado você a saber mais sobre o novo PHP 8.2.