A partir de la versión **9.13.012**, Scriptcase pasa a ser compatible con **PHP 8.2**, tanto en el entorno de desarrollo como en producción.

Al actualizar el entorno a PHP 8.2, el código personalizado (eventos, métodos y bibliotecas internas o externas) puede comenzar a emitir warnings/deprecations o incluso presentar fallos, dependiendo del uso de recursos obsoletos o con cambios de comportamiento.

A continuación se presentan los puntos más relevantes de PHP 8.2.

## 1) Propiedades dinámicas — Deprecated

En PHP 8.2, crear propiedades que no existen en la clase directamente en un objeto (por ejemplo, ***obj->nueva = 1;***) ahora genera un aviso de deprecación.  
Este comportamiento solo está permitido cuando la propia clase autoriza explícitamente la creación dinámica de propiedades o cuando el objeto es de tipo ***stdClass***.

**Antes (sin aviso):**

Era posible crear propiedades dinámicas en objetos sin que PHP emitiera ningún aviso.

1. *class User {} $u = new User();*
2. *$u->name = "Ana"; // dynamic property*

**PHP 8.2 (genera deprecación):**

Este tipo de uso ahora genera un aviso de deprecación. Para evitar el aviso, puede:

1. Declarar la propiedad directamente en la clase;  
   Usar el atributo #[\AllowDynamicProperties] (solución temporal);  
   Utilizar WeakMap cuando no tenga control sobre la clase.

## 2) “Relative callables” — Deprecated

Algunos formatos de callable que funcionaban con `call_user_func()`, pero no funcionan correctamente cuando se ejecutan como `$callable()`, han sido marcados como **deprecated** en PHP 8.2. Esto incluye llamadas que dependen del contexto de la clase, como `"self::method"`, `"parent::method"`, `"static::method"` y `["self", "method"]`

**Evite usar:**

1. *call\_user\_func("self::doStuff");*
2. *call\_user\_func(["self", "doStuff"]);*

**Use en su lugar:**

El nombre completo de la clase:

1. *call\_user\_func("MyClass::doStuff");*
2. *call\_user\_func(["MyClass", "doStuff"]);*

O una closure, cuando necesite acceder al contexto actual:

1. *call\_user\_func(fn() => $this->doStuff());*

## 3) Interpolación "${var}" y "${expr}" en strings — Deprecated

En PHP 8.2, el uso de interpolación en el formato`"${var}"` y `"${expr}"` en strings ha sido marcado como **deprecated**, ya que este estilo es menos claro y puede generar ambigüedad.

**Evite:**

1. *echo "Hola ${name}";*
2. *echo "Total: ${arr['total']}";*

**Use:**

1. *echo "Hola $name";*
2. *echo "Hola {$name}";*
3. *echo "Total: {${arr['total']}}"; // para expresiones*

## 4) utf8\_encode() y utf8\_decode() — Deprecated

Las funciones ***utf8\_encode()*** y ***utf8\_decode()*** han sido marcadas como **deprecated** en PHP 8.2, ya que asumen un encoding fijo, lo que puede generar resultados incorrectos en diferentes escenarios.

**Sustituciones comunes:**

1. *mb\_convert\_encoding($str, 'UTF-8', 'ISO-8859-1') // ajuste el encoding de origen según el caso*
2. *iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $str) // cuando sea aplicable*

![Quote](https://static.zohocdn.com/zoho-desk-editor/static/images/quote.png/)

Estas funciones asumen el encoding **ISO-8859-1** como valor predeterminado, lo que puede causar confusión y conversiones incorrectas; por eso fueron descontinuadas.

## 5) Funciones “case-insensitive” y conversión de mayúsculas/minúsculas — Cambio de comportamiento

En PHP 8.2, varias funciones que convierten o comparan texto ignorando mayúsculas y minúsculas pasaron a usar reglas **ASCII** (locale predeterminado “C”). Esto incluye funciones como ***strtolower()***, ***strtoupper()***, ***ucwords()*** y ***str\_ireplace()**.*

Con este cambio, estas funciones ya no consideran reglas específicas del idioma, lo que puede afectar textos con acentos o idiomas con reglas propias de capitalización, como el portugués (**pt-BR**) y el turco (**tr-TR**).

Para trabajar correctamente con textos localizados o caracteres acentuados, utilice la extensión **MBString**, por ejemplo:

1. *mb\_strtolower($texto, 'UTF-8');*

## 6) glob() con open\_basedir — Cambio en el valor de retorno

En PHP 8.2, el comportamiento de la función ***glob()*** cambió cuando la directiva ***open\_basedir*** está activa.

1. Si todas las rutas son bloqueadas por ***open\_basedir***, ***glob()*** pasa a devolver un array vacío (**[]**) — **antes, el retorno era false.**
2. Si solo algunas rutas son bloqueadas, puede mostrarse un **warning**.

**Código que puede verse afectado:**

1. *$files = glob($pattern);*
2. *if ($files === false) {*
3. *// ...*
4. *}*

**Ajuste recomendado:**

Actualice la verificación para considerar también el retorno **[]**, garantizando que el código trate correctamente ambos escenarios.

**Corrección (tratar** `false` **y** `[]`**):**

1. *$files = glob($pattern);*
2. *if ($files === false || $files === []) {*
3. *// Ningún archivo encontrado O acceso bloqueado por open\_basedir*
4. *// trate aquí (fallback, log, etc.)*
5. *} else {*
6. *foreach ($files as $file) {*
7. *// procesa los archivos*
8. *}*
9. *}*

**Alternativa más corta (cuando no necesita diferenciar** `false` **de** `[]`**):**

1. *$files = glob($pattern);*
2. *if (empty($files)) {*
3. *// vacío ([]) o false*
4. *} else {*
5. *foreach ($files as $file) {*
6. *// ...*
7. *}*
8. *}*

## 7) Otros comportamientos que pueden generar “efectos colaterales” (menos comunes)

En PHP 8.2, algunos cambios menores pueden provocar diferencias en el resultado de códigos que dependen exactamente del valor retornado o del orden de los datos.

**str\_split("") ahora retorna []**

Esto puede afectar validaciones que esperan siempre al menos un elemento en el *array*.

1. *var\_dump(str\_split(""));*
2. *// PHP 8.2: array(0) { }*
3. *// Antes:  array(1) { [0]=> string(0) "" }*

`var_export()` y nombres de clases totalmente calificados  
La función `var_export()` ahora exporta los nombres de las clases utilizando el nombre **totalmente calificado** (incluyendo `\`), especialmente cuando la clase se encuentra dentro de un *namespace*.

Esto puede generar diferencias en pruebas automatizadas, snapshots o comparaciones 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()*** con ***SORT\_REGULAR*** y *strings* numéricas

En algunos casos, el orden de los elementos puede cambiar cuando las claves del *array* son *strings* numéricas.  
Por ejemplo, `"2"` y `"10"`, ya que pasan a seguir las reglas actuales de comparación.

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));*