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.
-
class User {} $u = new User();
- $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:
- 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:
- call_user_func("self::doStuff");
- call_user_func(["self", "doStuff"]);
Use en su lugar:
El nombre completo de la clase:
- call_user_func("MyClass::doStuff");
- call_user_func(["MyClass", "doStuff"]);
O una closure, cuando necesite acceder al contexto actual:
- 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:
- echo "Hola ${name}";
- echo "Total: ${arr['total']}";
Use:
- echo "Hola $name";
- echo "Hola {$name}";
- 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:
-
mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1') // ajuste el encoding de origen según el caso
-
iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $str) // cuando sea aplicable
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:
- 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.
- Si todas las rutas son bloqueadas por open_basedir, glob() pasa a devolver un array vacío ([]) — antes, el retorno era false.
- Si solo algunas rutas son bloqueadas, puede mostrarse un warning.
Código que puede verse afectado:
- $files = glob($pattern);
- if ($files === false) {
- // ...
- }
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 []):
- $files = glob($pattern);
- if ($files === false || $files === []) {
- // Ningún archivo encontrado O acceso bloqueado por open_basedir
- // trate aquí (fallback, log, etc.)
- } else {
- foreach ($files as $file) {
- // procesa los archivos
- }
- }
Alternativa más corta (cuando no necesita diferenciar false de []):
- $files = glob($pattern);
- if (empty($files)) {
- // vacío ([]) o false
- } else {
- foreach ($files as $file) {
- // ...
- }
- }
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.
- var_dump(str_split(""));
- // PHP 8.2: array(0) { }
- // 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.
- namespace App\Model;
- class User {}
- echo var_export(new User(), true);
- // PHP 8.2: \App\Model\User::__set_state(array(
- // ...
- // ))
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.
- $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));