Adaptações de Compatibilidade para o PHP 8.2

Adaptações de Compatibilidade para o PHP 8.2

A partir da release 9.13.012, o Scriptcase passa a ser compatível com o PHP 8.2, tanto no ambiente de desenvolvimento quanto em produção.

Ao atualizar o ambiente para o PHP 8.2, códigos personalizados (eventos, métodos e bibliotecas internas ou externas) podem passar a emitir warnings/deprecations ou até apresentar falhas, dependendo do uso de recursos depreciados ou com mudança de comportamento.

Abaixo estão os pontos mais relevantes do PHP 8.2.


1) Propriedades dinâmicas (dynamic properties) — Deprecated

No PHP 8.2, criar propriedades que não existem na classe diretamente em um objeto (por exemplo, obj->nova = 1;) passou a gerar deprecation.
Esse comportamento só é permitido quando a própria classe autoriza a criação dinâmica de propriedades ou quando o objeto é do tipo stdClass.

Antes (sem aviso):
Era possível criar propriedades dinamicamente em objetos sem que o PHP emitisse qualquer aviso.
  1. class User {} $u = new User();
  2. $u->name = "Ana"; // dynamic property
PHP 8.2 (gera deprecation):
Esse tipo de uso passou a gerar deprecation. Para evitar o aviso, você pode:
  1. Declarar a propriedade diretamente na classe;
    Usar o atributo #[\AllowDynamicProperties] (solução paliativa);
    Utilizar WeakMap quando você não tem controle sobre a classe.

2) “Relative callables” — Deprecated

Alguns formatos de callable que funcionavam com call_user_func(), mas não funcionam corretamente quando executados como $callable(), passaram a ser marcados como deprecated no PHP 8.2. Isso inclui chamadas que dependem do contexto da classe, como "self::method", "parent::method", "static::method" e ["self", "method"]

Evite usar:
  1. call_user_func("self::doStuff");
  2. call_user_func(["self", "doStuff"]);
Use no lugar:
O nome completo da classe:
  1. call_user_func("MinhaClasse::doStuff");
  2. call_user_func(["MinhaClasse", "doStuff"]);
Ou uma closure, quando precisar acessar o contexto atual:
  1. call_user_func(fn() => $this->doStuff());

3) Interpolação "${var}" e "${expr}" em strings — Deprecated

No PHP 8.2, o uso de interpolação no formato "${var}" e "${expr}" em strings passou a ser deprecated, pois esse estilo é menos claro e pode causar ambiguidade.

Evite:
  1. echo "Olá ${name}";
  2. echo "Total: ${arr['total']}";
Use:
  1. echo "Olá $name";
  2. echo "Olá {$name}";
  3. echo "Total: {${arr['total']}}"; // para expressões

4) utf8_encode() e utf8_decode() — Deprecated

As funções utf8_encode() e utf8_decode() foram marcadas como deprecated no PHP 8.2, pois assumem um encoding fixo, o que pode gerar resultados incorretos em diferentes cenários.
Substituições comuns:
  1. mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1') // ajuste o encoding de origem conforme o caso
  2. iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $str) // quando aplicável
Quote
Essas funções assumem o encoding ISO-8859-1 como padrão, o que pode causar confusão e conversões incorretas; por isso foram descontinuadas.

5) Funções “case-insensitive” e conversão de maiúsculas/minúsculas — Mudança de comportamento

No PHP 8.2, várias funções que convertem ou comparam texto ignorando maiúsculas e minúsculas passaram a usar regras ASCII (locale padrão “C”). Isso inclui funções como strtolower(), strtoupper(), ucwords() e str_ireplace().

Com essa mudança, essas funções não consideram mais regras específicas de idioma, o que pode afetar textos com acentuação ou idiomas com regras próprias de capitalização, como português (pt-BR) e turco (tr-TR).

Para trabalhar corretamente com textos localizados ou caracteres acentuados, utilize a extensão MBString, por exemplo:
  1. mb_strtolower($texto, 'UTF-8');

6) glob() com open_basedir — Mudança no retorno

No PHP 8.2, o comportamento da função glob() mudou quando a diretiva open_basedir está ativo.
  1. Se todos os caminhos forem bloqueados pelo open_basedir, glob() passa a retornar um array vazio ([]) — antes, o retorno era false.
  2. Se apenas alguns caminhos forem bloqueados, um warning pode ser exibido.
Código que pode ser afetado:
  1. $files = glob($pattern);
  2. if ($files === false) {
  3.     // ...
  4. }
Ajuste recomendado:
Atualize a verificação para considerar também o retorno [], garantindo que o código trate corretamente os dois cenários.

Correção (tratar false e []):
  1. $files = glob($pattern);
  2. if ($files === false || $files === []) {
  3.     // Nenhum arquivo encontrado OU acesso bloqueado pelo open_basedir
  4.     // trate aqui (fallback, log, etc.)
  5. } else {
  6.     foreach ($files as $file) {
  7.         // processa os arquivos
  8.     }
  9. }

Alternativa mais curta (quando não precisa diferenciar false de []):
  1. $files = glob($pattern);
  2. if (empty($files)) {
  3.     // vazio ([]) ou false
  4. } else {
  5.     foreach ($files as $file) {
  6.         // ...
  7.     }
  8. }

7) Outros comportamentos que podem gerar “efeitos colaterais” (menos comuns)

No PHP 8.2, algumas mudanças menores podem causar diferenças de resultado em códigos que dependem exatamente do valor retornado ou da ordem dos dados.

str_split("") agora retorna []
Isso pode afetar validações que esperam sempre pelo menos um item no array.
  1. var_dump(str_split(""));
  2. // PHP 8.2: array(0) { }
  3. // Antes:  array(1) { [0]=> string(0) "" }


var_export() e nomes de classes totalmente qualificados
A função var_export() passou a exportar nomes de classes usando o nome totalmente qualificado (incluindo \), principalmente quando a classe está dentro de um namespace.

Isso pode gerar diferenças em testes automatizados, snapshots ou comparações de string.

  1. namespace App\Model;

  2. class User {}

  3. echo var_export(new User(), true);
  4. // PHP 8.2: \App\Model\User::__set_state(array(
  5. // ...
  6. // ))


ksort() / krsort() com SORT_REGULAR e strings numéricas

Em alguns casos, a ordem dos elementos pode mudar quando as chaves do array são strings numéricas.
Por exemplo, "2" e "10", pois passam a seguir as regras atuais.

  1. $a = ["10" => "dez", "2" => "dois", "1" => "um"];

  2. ksort($a, SORT_REGULAR);
  3. var_dump(array_keys($a));

  4. krsort($a, SORT_REGULAR);
  5. var_dump(array_keys($a));



    • Related Articles

    • Atualizando o Módulo de Segurança para Suporte ao Novo LDAP

      LDAP é um protocolo amplamente utilizado para gerenciamento e autenticação de usuários em redes corporativas. Ele permite que aplicações se conectem a um diretório centralizado com o ACtive Directory, para validar as credenciais e obter informações ...
    • Funções PHP necessárias para o ScriptCase

      No PHP, existem algumas funções essenciais para o funcionamento do Scriptcase. Em alguns servidores, esta funções são desabilitadas, isso faz com que o Scriptcase não funcione devidamente. Segue a lista das funções que não podem estar bloqueadas, ...
    • Guia de Migração do PHP 7.x para o PHP 8.2

      A partir da release 9.13.012, o Scriptcase passa a ser compatível com o PHP 8.2, tanto no ambiente de desenvolvimento quanto em produção. Ao migrar diretamente do PHP 7.x para o PHP 8.2, códigos personalizados (eventos, métodos e bibliotecas internas ...
    • Criando a chave de Api do Google Maps

      Neste artigo veja como habilitar e obter a chave para utilização do Google Maps nas aplicações do Scriptcase. Acessando a Plataforma do google Maps 1. Acesse o link https://mapsplatform.google.com/ para criar sua chave. Será necessário realizar login ...
    • Como Gerar o Relatório para Migração do PHP

      Com o intuito de auxiliar os clientes que utilizam o Scriptcase em uma versão desatualizada do PHP (7.0 ou 7.3), montamos um roteiro para ajudar na migração dos projetos. Para que possamos ajudar na migração, é necessário o envio de um relatório ...