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](https://static.zohocdn.com/zoho-desk-editor/static/images/quote.png/)

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;*
3. *class User {}*
5. *echo var\_export(new User(), true);*
6. *// PHP 8.2: \App\Model\User::\_\_set\_state(array(*
7. *// ...*
8. *// ))*

***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"];*
3. *ksort($a, SORT\_REGULAR);*
4. *var\_dump(array\_keys($a));*
6. *krsort($a, SORT\_REGULAR);*
7. *var\_dump(array\_keys($a));*