Skip to main content
PHP

Migrar proyectos de PHP 7 a PHP 8.3 sin morir en el intento

Por 24 octubre, 2025octubre 28th, 2025Sin comentarios
Migración PHP paso a paso. Ejemplos de código PHP 8

Migrar un proyecto de PHP 7.x a PHP 8.3 puede parecer una odisea (y, si el código tiene unos años, probablemente lo sea 😅).
Pero la realidad es que PHP 8.3 no solo trae nuevas funcionalidades, sino también un salto en rendimiento brutal, mejoras de seguridad y nuevas formas de escribir código más limpio y mantenible.

En este artículo te cuento cómo hacer la migración paso a paso, los errores más comunes que vas a encontrar y algunos trucos para no romper nada por el camino.
Y sí, te dejo ejemplos de código reales que puedes copiar y probar.

🚀 Por qué deberías actualizar a PHP 8.3

Antes de entrar al barro, entendamos el “por qué”.
Si tu web o aplicación sigue en PHP 7.4 (o anterior), ya no recibe soporte oficial desde noviembre de 2022. Eso significa:

  • ❌ No hay actualizaciones de seguridad.

  • ⚠️ Los hostings empiezan a forzar el cambio.

  • 🧱 Tu aplicación será más lenta y menos compatible con librerías modernas.

En cambio, PHP 8.3 ofrece:

  • 🔥 Hasta 3 veces más rápido en ciertas operaciones.

  • 🧠 Nuevas características como readonly, enum, match, attributes, json_validate(), etc.

  • 🔒 Mejor gestión de tipos y seguridad en ejecución.

🧭 Paso 1: Identifica tu versión actual y tus dependencias

Lo primero que debes hacer es saber en qué punto estás.
Puedes comprobarlo fácilmente ejecutando:

php -v

También deberías listar todas las dependencias que usa tu proyecto.
Si utilizas Composer, ejecuta:

composer show

⚙️ Pro tip: verifica si tus librerías ya son compatibles con PHP 8.3.
En Packagist puedes revisar la sección «require» de cada paquete para confirmar su compatibilidad.

🧩 Paso 2: Crea un entorno de pruebas con PHP 8.3

Nunca migres directamente en producción.
Levanta un entorno de desarrollo o staging con PHP 8.3.

Si trabajas con Docker:

services:
app:
image: php:8.3-apache
volumes:
- .:/var/www/html

O si estás en un hosting, crea un subdominio y cambia solo la versión de PHP desde el panel.

🔍 Paso 3: Activa el modo de errores y logs

Durante la migración, activa el modo paranoico de errores 😅:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Esto te ayudará a detectar deprecaciones y errores fatales antes de que afecten al usuario.

⚙️ Paso 4: Errores y cambios más comunes al migrar

Aquí viene lo divertido.
Te dejo una lista con los cambios más importantes y ejemplos reales.

1️⃣ Variables y referencias pasadas por valor

En PHP 8, algunos comportamientos con referencias cambiaron:

// PHP 7.x (funcionaba)
$array = [];
foreach (range(1,3) as $i) {
$array[] =& $i;
}
print_r($array); // [3,3,3]// PHP 8.3 (cambia)
print_r($array); // [1,2,3]

Ahora las referencias en bucles se comportan de forma más predecible.

2️⃣ Deprecación de funciones antiguas

Varias funciones han sido eliminadas o marcadas como obsoletas:

Función obsoleta Alternativa recomendada
create_function() Usa funciones anónimas
get_magic_quotes_gpc() Eliminada
each() Usa foreach() directamente
ereg(), eregi() Usa preg_match()
filter_var($var, FILTER_SANITIZE_STRING) Usa htmlspecialchars() o validación personalizada

3️⃣ Tipado estricto y cambios en comparación

// PHP 7.x
var_dump(0 == 'hello'); // true// PHP 8+
var_dump(0 == 'hello'); // false

PHP 8 introduce comparaciones más estrictas y seguras.
Esto puede romper lógica antigua que dependía de “falsos positivos”.

4️⃣ Cambios en implode()

// PHP 7.x aceptaba ambos órdenes
implode(',', ['a','b']); // OK
implode(['a','b'], ','); // También OK// PHP 8.3 lanza aviso si cambias el orden

Siempre usa implode(string $separator, array $array).

5️⃣ Nuevas palabras reservadas

Algunas palabras ahora están reservadas, como match, enum, readonly.
Evita usarlas como nombres de variables o funciones:

// ❌ No hagas esto
$match = 'valor';// ✅ Mejor
$match_value = 'valor';

6️⃣ JSON Validate

PHP 8.3 incorpora la nueva función json_validate(), que te permite validar JSON sin tener que decodificarlo:

$json = '{"nombre": "Juan", "edad": 30}';
if (json_validate($json)) {
echo "JSON válido";
} else {
echo "JSON inválido";
}

7️⃣ readonly Properties

Una de las mejores incorporaciones para código más limpio:

class Usuario {
public readonly string $email;
public function __construct($email) {
$this->email = $email;
}
}$u = new Usuario('test@webjrcode.com');
$u->email = 'otro@correo.com'; // ❌ Error en tiempo de ejecución

8️⃣ Enumeraciones (enum)

Simplifican la gestión de valores fijos:

enum Estado: string {
case ACTIVO = 'activo';
case INACTIVO = 'inactivo';
}$estado = Estado::ACTIVO;
echo $estado->value; // activo

🧪 Paso 5: Usa herramientas de compatibilidad

Hay herramientas que te ayudan a identificar problemas automáticamente:

  • 🧰 PHP Compatibility Checker:

    composer require --dev phpcompatibility/php-compatibility

    Luego:

    vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 8.3 .
  • 🔎 Rector PHP:
    Permite modernizar código automáticamente:

    composer require --dev rector/rector
    vendor/bin/rector process src

🧠 Paso 6: Tests y QA

Si tienes tests unitarios (PHPUnit, Pest…), ejecútalos antes y después de la migración.
Si no los tienes… este es el momento perfecto para empezar 😉.

Y si usas WordPress, recuerda revisar la compatibilidad de los plugins y del tema. Muchos errores vienen de ahí, no de tu código.

🛡️ Paso 7: Lanza la actualización con cabeza

Cuando todo funcione correctamente en el entorno de pruebas:

  1. Sube los archivos a producción.

  2. Cambia la versión de PHP desde el panel o .htaccess.

  3. Revisa logs y errores las primeras 24-48 h.

🎯 Conclusión

Migrar a PHP 8.3 no tiene por qué ser una pesadilla.
Si lo haces con método y pruebas, ganarás en rendimiento, seguridad y mantenibilidad.

Y, sobre todo, estarás preparando tu proyecto para el futuro.
El salto de calidad entre PHP 7.4 y 8.3 es tan grande que notarás la diferencia desde el primer echo.

💡 Bonus: Script rápido para detectar funciones obsoletas

grep -r --include='*.php' "create_function" .
grep -r --include='*.php' "each("
grep -r --include='*.php' "get_magic_quotes_gpc"

¿Te ha servido este artículo?
Déjame un comentario o escríbeme si quieres que prepare una guía más avanzada para modernizar proyectos PHP paso a paso con Rector y Composer.

Jairo Calero

Desarrollador web frontend y backend, especialista en webs app desarrolladas en PHP y Javascript. Experto en HTML, CSS3, PHP y Javascript con frameworks y librerías como jQuery, Angular y Bootstrap. Gestor de herramientas SEO como Google Analytics, Search Console, SEMrush o Hotjar. Email marketing y Big data.

Deja tu respuesta