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 ou externas) podem passar a emitir warnings, deprecations ou até apresentar falhas, devido a mudanças de comportamento e à descontinuação de recursos introduzidos nas versões mais recentes do PHP.
Este tutorial reúne os principais pontos de atenção da migração para o PHP 8.2, com explicações e exemplos práticos para facilitar a adaptação do código e reduzir impactos durante a atualização.
1) Operadores ternários aninhados sem parênteses explícitos — Não permitido
Expressões condicionais utilizando operadores ternários aninhados sem parênteses explícitos não são permitidas no PHP 8.2.
Esse tipo de escrita pode gerar ambiguidades e não é mais aceito pelo interpretador.
❌ Exemplo não permitido:
- $result = $aa != "" ? $xxx : isset($bb) && $bb != "" ? $zzz : "";
✅ Forma recomendada:
Reescreva a lógica de forma explícita, utilizando estruturas condicionais:
- if ($aa != "") {
- $result = $xxx;
- } elseif (isset($bb) && $bb != "") {
- $result = $zzz;
- } else {
- $result = "";
- }
2) Acesso a valores de array e string usando chaves — Deprecated
O acesso a valores de arrays e strings utilizando a sintaxe de chaves {} não é permitido no PHP 8.2.
Esse formato está depreciado e pode gerar warnings ou erros durante a execução.
Utilize sempre a sintaxe com colchetes [] para acessar índices.
❌ Exemplo não permitido:
- $array = [1, 2];
- echo $array{1};
- $string = "foo";
- echo $string{0};
Esse tipo de acesso gera mensagens como:
Deprecated: Array and string offset access syntax with curly braces is deprecated
✅ Forma correta:
- $array = [1, 2];
- echo $array[1]; // exibe 2
- $string = "foo";
- echo $string[0]; // exibe "f"
3) Parâmetros obrigatórios após parâmetros opcionais — Deprecated
A declaração de funções ou métodos com parâmetros obrigatórios após parâmetros opcionais não é permitida no PHP 8.2.
Esse tipo de assinatura é considerada incorreta e pode gerar warnings ou deprecations durante a execução.
❌ Exemplo não permitido:
- function foo($param_optional = null, $param_required) {
- // ...
- }
Esse tipo de declaração pode gerar mensagens como:
Deprecated: Required parameter $param_required follows optional parameter $param_optional
✅ Forma correta:
Declare sempre os parâmetros obrigatórios primeiro, seguidos pelos opcionais:
- function foo($param_required, $param_optional = null) {
- // ...
- }
4) Operações aritméticas com strings não numéricas — Não permitido
Operações aritméticas envolvendo strings não numéricas não são permitidas no PHP 8.2.
Esse tipo de operação pode gerar warnings ou erros, pois valores que não representam números não são mais tratados implicitamente como zero.
❌ Exemplo não permitido:
Esse tipo de operação pode resultar em erro, pois $b não contém um valor numérico válido.
✅ Forma correta:
Antes de realizar a operação, é necessário garantir que o valor seja numérico.
Exemplo 1 — validação direta:
- $a = is_numeric($b) ? $b + 2 : 2;
Exemplo 2 — normalização do valor:
- if (!is_numeric($b)) {
- $b = 0;
- }
- $a = $b + 2;
5) Variáveis e índices inexistentes — Atenção a warnings
O uso de variáveis não definidas ou índices de array inexistentes pode gerar warnings no PHP 8.2.
Esse comportamento ocorre quando o código tenta acessar valores que ainda não foram definidos.
Se a exibição de warnings estiver habilitada, esse tipo de situação pode resultar em mensagens frequentes durante a execução do código.
❌ Exemplo não permitido:
Ou:
Quando $b ou $array['key'] não existem, um warning pode ser exibido.
✅ Forma correta:
Antes de utilizar uma variável ou índice de array, verifique se ele existe.
- $a = isset($b) ? $b + 2 : 2;
Ou, no caso de arrays:
- $a = isset($array['key']) ? $array['key'] + 2 : 2;
6) Função each() — Removida
A função each() retorna o par chave/valor atual de um array e avança o seu cursor interno.
Essa função não está disponível no PHP 8.2.
Caso ela seja utilizada em suas aplicações, o código precisa ser alterado antes da publicação em um ambiente com PHP 8.2 ou superior.
Opções comuns de substituição:
- foreach()
- key()
- current()
- next()
❌ Exemplo não suportado:
- $result = "";
- $tab = array(
- 0 => array('tp' => 1, 'vl' => 'aaa'),
- 1 => array('tp' => 2, 'vl' => 'bbb'),
- 2 => array('tp' => 3, 'vl' => 'ccc')
- );
- while (list($key, $val) = each($tab)) {
- $result .= $tab[$key]["vl"];
- }
✅ Forma recomendada (usando foreach()):
- $result = "";
- $tab = array(
- 0 => array('tp' => 1, 'vl' => 'aaa'),
- 1 => array('tp' => 2, 'vl' => 'bbb'),
- 2 => array('tp' => 3, 'vl' => 'ccc')
- );
- foreach ($tab as $key => $val) {
- $result .= $tab[$key]["vl"];
- }
7) Função array_key_exists() — Uso em objetos deprecated
A função array_key_exists() verifica se uma chave ou índice existe em um array.
No PHP 8.2, o uso dessa função para verificar propriedades de objetos está deprecated.
Para esse cenário, utilize isset() ou property_exists().
❌ Exemplo não recomendado:
- if (array_key_exists('index', $array1)) {
- // código
- }
✅ Forma recomendada:
- if (isset($array1['index'])) {
- // código
- }
8) Função money_format() — Removida
A função money_format() formata um número como uma string de moeda.
Essa função não está disponível no PHP 8.2.
Para realizar a formatação monetária, utilize a extensão Intl, por meio da classe NumberFormatter.
❌ Exemplo não suportado:
- echo money_format("%.2n", 1234.56);
✅ Forma recomendada (usando NumberFormatter):
- $currencyObject = new NumberFormatter("pt-BR", NumberFormatter::CURRENCY);
- echo $currencyObject->format(1234.56);
9) Função mb_strrpos() — Parâmetro de encoding deprecated
A função mb_strrpos() localiza a posição da última ocorrência de um valor em uma string.
No PHP 8.2, informar a codificação como terceiro parâmetro está deprecated.
Em vez disso, passe um offset como terceiro parâmetro e a codificação como quarto.
❌ Exemplo não recomendado:
- $string = 'O rato roeu a roupa';
- echo mb_strrpos($string, 'roeu', 'UTF-8');
✅ Forma correta:
- $string = 'O rato roeu a roupa';
- echo mb_strrpos($string, 'roeu', 0, 'UTF-8');
10) 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.
11) “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());
12) 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
13) 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.
14) 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');
15) 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) {
- // ...
- }
- }
16) 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));