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.
- class User {} $u = new User();
- $u->name = "Ana"; // dynamic property
PHP 8.2 (gera deprecation):
Esse tipo de uso passou a gerar deprecation. Para evitar o aviso, você pode:
- 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:
- call_user_func("self::doStuff");
- call_user_func(["self", "doStuff"]);
Use no lugar:
O nome completo da classe:
- call_user_func("MinhaClasse::doStuff");
- call_user_func(["MinhaClasse", "doStuff"]);
Ou uma closure, quando precisar acessar o contexto atual:
- 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:
- echo "Olá ${name}";
- echo "Total: ${arr['total']}";
Use:
- echo "Olá $name";
- echo "Olá {$name}";
- 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:
- mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1') // ajuste o encoding de origem conforme o caso
- iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $str) // quando aplicável
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:
- 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.
- Se todos os caminhos forem bloqueados pelo open_basedir, glob() passa a retornar um array vazio ([]) — antes, o retorno era false.
- Se apenas alguns caminhos forem bloqueados, um warning pode ser exibido.
Código que pode ser afetado:
- $files = glob($pattern);
- if ($files === false) {
- // ...
- }
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 []):
- $files = glob($pattern);
- if ($files === false || $files === []) {
- // Nenhum arquivo encontrado OU acesso bloqueado pelo open_basedir
- // trate aqui (fallback, log, etc.)
- } else {
- foreach ($files as $file) {
- // processa os arquivos
- }
- }
Alternativa mais curta (quando não precisa diferenciar false de []):
- $files = glob($pattern);
- if (empty($files)) {
- // vazio ([]) ou false
- } else {
- foreach ($files as $file) {
- // ...
- }
- }
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.
- var_dump(str_split(""));
- // PHP 8.2: array(0) { }
- // 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.
- namespace App\Model;
- class User {}
- echo var_export(new User(), true);
- // PHP 8.2: \App\Model\User::__set_state(array(
- // ...
- // ))
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.
- $a = ["10" => "dez", "2" => "dois", "1" => "um"];
- ksort($a, SORT_REGULAR);
- var_dump(array_keys($a));
- krsort($a, SORT_REGULAR);
- var_dump(array_keys($a));