PHP 8: todo lo que debes saber sobre la nueva actualización

PHP es uno de los lenguajes de programación más fáciles de aprender. Con un buen tutorial de PHP y mucha motivación, en pocas horas puedes escribir tus primeros scripts y ejecutar comandos. La versión actual, PHP 7, ya trajo consigo una gran optimización de la velocidad, lo que aumentó su prestigio. La versión 8.0 supondrá una actualización muy importante para este lenguaje de código abierto.

El desarrollador Brent Roose publicó recientemente un anuncio con las novedades que presentaría la nueva versión de PHP. Puesto que aún se está trabajando en esta actualización, es posible que se anuncien más cambios al respecto en los próximos meses hasta su lanzamiento.

¿Cuándo se lanzará PHP 8?

Después de un largo período de incertidumbre, los desarrolladores han anunciado que el lanzamiento de PHP 8 tendrá lugar el 26 de noviembre de 2020. Esto coincide con el ciclo habitual de 3 años de PHP. Además, en diciembre del 2019 se publicó PHP 7.4 y PHP 7.1 fue suspendido. Sin embargo, muchas páginas web escritas en PHP utilizan aún una versión antigua, que muy pronto dejará de ser compatible. Mantener el código de la página web actualizado y usar las versiones nuevas de PHP puede traer consigo algunas ventajas. Las nuevas versiones ofrecen más variedad, el rendimiento aumenta considerablemente y el nivel de seguridad es más alto.

¡Ya puedes probar PHP 8!

Si eres cliente del servicio de alojamiento web de IONOS, ya puedes probar la versión beta de PHP 8. ¿Aún no lo eres? Entonces contrata ya una de nuestras económicas ofertas de alojamiento web. En tu cuenta de cliente de IONOS, podrás cambiar la versión actual de PHP por la versión beta de PHP 8. Pero, cuidado: no se recomienda usar la versión beta de PHP 8 en sistemas de producción.

Hecho

Las primeras versiones alfa de PHP 8 ya se han lanzado. Sin embargo, éstas son solo versiones de prueba y no deben utilizarse en versiones online de páginas web o aplicaciones.

¿Habrá complicaciones con los códigos antiguos?

Puesto que PHP 8 es una versión principal, hay que tener en cuenta que algunos códigos antiguos no serán compatibles. La mayoría de los cambios que podrían presentar complicaciones ya estaban obsoletos en las versiones 7.2, 7.3 y 7.4.

Los últimos cambios incluyen:

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Reflection export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

Si has mantenido tu código actualizado, no tendrás ningún problema, incluso teniendo la nueva actualización cambios incompatibles con versiones anteriores. En esta publicación en GitHub puedes encontrar una lista completa con todos los cambios.

Nota

Microsoft ha anunciado que Windows no soportará PHP 8 y sus versiones posteriores. Sin embargo, los desarrolladores de PHP ya han comunicado su voluntad de solucionar este problema.

Nuevas características de PHP 8

Se espera que la nueva versión de PHP presente nuevas características que ampliarán las posibilidades de los desarrolladores web.

Compilador JIT

La mayor novedad será el compilador JIT, que mejorará considerablemente el rendimiento. PHP no se compila, sino que se interpreta línea por línea. El compilador JIT (Just in Time) compilaría parte del código durante el tiempo de ejecución, por lo que funcionaría de manera muy similar a una versión en caché del código. Con ello, el rendimiento debería mejorar considerablemente.

Esta característica de PHP 8 ya fue probada de manera muy exitosa por Pedro Escudero. Usó un script simple para comparar las versiones 5.3, 7.4 y 8 (con y sin JIT). Para ello, ejecutó el script cien veces en cada versión y calculó el tiempo promedio.

El resultado fueron los siguientes valores:

Versión Tiempo en segundos
5.3 0,64574003219604
7.4 0,10253500938416
8 (sin JIT) 0,098223924636841
8 (con JIT) 0,053637981414795

Aunque la diferencia entre la versión 7.4 y la 8 sin JIT no es muy grande, entre la 7.4 y la 8 con JIT es significativa. El compilador JIT proporciona una mejora del rendimiento de más del 45 %.

La extensión JSON estará siempre activa

En versiones anteriores del lenguaje de scripts, la extensión JSON podía desactivarse de forma opcional. Sin embargo, como JSON es un formato de datos muy importante, los desarrolladores de PHP han decidido dejar la extensión activada todo el tiempo. Esto debería simplificar el trabajo con PHP.

Tipos de unión

Los union types también aparecen en otros lenguajes como C/C++, TypeScript o Haskell. Permiten crear uniones de dos o más tipos de datos, pudiéndose utilizar cualquiera de ellos. En el código, esto se vería de la siguiente manera:

public function foo(Foo|Bar $input): int|float;

Sin embargo, existe una limitación. Void no puede formar parte de un union type, ya que no devuelve ningún valor. Además, las uniones nullable pueden escribirse con |null o ?, como te mostramos en este ejemplo:

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Tipo de retorno estático

Static es un nombre de clase especial y en la nueva versión será un tipo de retorno válido junto a self & parent.

Mapas débiles

En PHP 7.4 ya aparecían los WeakRefs, y ahora con WeakMaps se ofrece una extensión de esta función. WeakMaps y WeakRefs pueden usarse para eliminar objetos, solo si la caché aún referencia a las clases de entidad de los objetos. Esto ofrece una administración de los objetos que ahorra recursos. Un ejemplo sacado de la documentación:

class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...
}

Usar ::class en los objetos

En versiones anteriores se tenía que usar get_class() para asignar una clase a los objetos. Ahora se puede aplicar ::class directamente a los objetos. Esto ayuda a mantener el código más limpio.

Interfaz encadenable

Stringable interface implementa una interfaz automáticamente. Hasta ahora, este paso debía hacerse manualmente. Esto puede hacerse para todas las strings o para aquellas donde __toString() esté implementado. En el código se leería de la siguiente manera:

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');

Convertir DateTime

Con PHP 8 será considerablemente más fácil convertir DateTime. Los desarrolladores han añadido DateTime::createFromInterface() y DatetimeImmutable::createFromInterface(). De esta manera DateTime y DateTimeImmutable se podrán convertirde uno al otro.

fdiv

Con fdiv será posible una división por 0. Ahora se obtiene INF, -ING o NAN como valor de retorno.

Anotaciones de tipo

La nueva versión incluirá anotaciones de tipo correctas para todas las funciones y métodos internos.

Errores de tipo

Anteriormente, solo las funciones definidas por el usuario activaban los TypeErrors. Las funciones internas emitían una advertencia y daban null. Con PHP 8, las funciones internas también producirán TypeErrors.

Reclassified engine warnings

Hasta ahora había muchos errores que solo emitían un aviso. Esto será actualizado. Aquí encontrarás un listado completo de los nuevos mensajes de error en PHP.

Default error reporting level

Los errores que hasta ahora eran ignorados sin generar un aviso, se presentarán como E_ALL, E_NOTICE y E_DEPRECATED. Estos errores ya existían antes de la versión 8, pero no se notificaban visiblemente.

@ ya no suprimirá los errores fatales

Esta nueva característica también ayudará en la detección de errores. En lugar de suprimirlos con el operador @ como se hacía hasta ahora, se deberá utilizar display_errors=Off en el servidor.

Orden de los operadores de concatenación

Esta función ya se había introducido en PHP 7.4 y ahora será plenamente funcional. PHP reaccionará ahora de manera más inteligente ante múltiples operadores. Como ejemplo te mostramos el siguiente código:

Hasta ahora, PHP interpretaba

echo "sum: " . $a + $b;

como

echo ("sum: " . $a) + $b;

Ahora, PHP 8 lo interpretará como

echo "sum: " . ($a + $b);

Reflection

Las firmas se cambiarán. Anteriormente, Reflection se presentaba de la siguiente manera:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

En PHP 8, se escribirá tal que:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

Para utilizar PHP 7 y PHP 8 simultaneamente, se debe proceder así:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);

Estas características de PHP 8 están ya confirmadas. Aún así, se esperan más novedades en los meses previos a su lanzamiento.


¡No te vayas! ¡Tenemos algo para ti!
Consigue tu dominio .mx un año gratis.

Introduce el dominio que deseas en la barra de búsqueda para comprobar su disponibilidad.
12 meses desde $0/año
después $700/año