Adaptaciones de compatibilidad para PHP 8.2

Adaptaciones de compatibilidad para PHP 8.2

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

  2. class User {}

  3. echo var_export(new User(), true);
  4. // PHP 8.2: \App\Model\User::__set_state(array(
  5. // ...
  6. // ))


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"];

  2. ksort($a, SORT_REGULAR);
  3. var_dump(array_keys($a));

  4. krsort($a, SORT_REGULAR);
  5. var_dump(array_keys($a));



    • Related Articles

    • Actualizando el PHP de Scriptcase

      Actualmente, la instalación de Scriptcase 9.x viene con la versión 7.0.14 de PHP, desafortunadamente esta versión tiene un problema de compatibilidad con la nueva versión de autenticación de MySQL 8.0, por lo que es necesario realizar la ...
    • Cómo Generar el Informe para la Migración de PHP

      Con el objetivo de ayudar a los clientes que utilizan Scriptcase con una versión desactualizada de PHP (7.0 o 7.3), hemos preparado una guía para facilitar la migración de proyectos. Para ayudar con la migración, es necesario enviar un informe que ...
    • Funciones PHP necesarias para ScriptCase

      En PHP, hay algunas funciones esenciales para el funcionamiento de Scriptcase. En algunos servidores, estas funciones están deshabilitadas, esto hace que Scriptcase no funcione correctamente. Si está utilizando un servidor de alojamiento compartido, ...
    • Instalador para macOS - PHP 7.3

      El instalador de Scriptcase instala Apache, PHP y Scriptcase en su sistema operativo. El instalador no incluye una base de datos Pre-requisitos Para descargar el instalador de Scriptcase, vaya a nuestra página de descarga haciendo clic aqui. ...
    • Guía de migración de PHP 7.x a PHP 8.2

      A partir de la release 9.13.012, Scriptcase pasa a ser compatible con PHP 8.2, tanto en el entorno de desarrollo como en producción. Al migrar directamente de PHP 7.x a PHP 8.2, los códigos personalizados (eventos, métodos y bibliotecas internas o ...