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 la motivación adecuada, puedes escribir tus primeros scripts y ejecutar comandos en pocas horas. PHP 7 ya trajo consigo una gran optimización de la velocidad, lo que aumentó su prestigio. Con la versión 8.0, se ha producido una gran actualización en el lenguaje de código abierto .

PHP 8: lanzamiento en noviembre de 2020

El 26 de noviembre de 2020 había llegado el momento: con el lanzamiento de PHP 8.0.0 se daba a conocer la última versión del popular lenguaje de scripting. Esto corresponde al ciclo habitual de tres años de PHP. El predecesor, PHP 7.4, había estado activo alrededor de un año, después de que se finalizara con el soporte para PHP 7.1. A finales de 2020 también se suspende el soporte para PHP 7.2.

Muchas páginas web escritas en PHP utilizan aún una versión antigua. Aunque esto es posible, se recomienda no hacerlo. Mantener el código de la página web actualizado y usar las versiones nuevas de PHP puede traer consigo diferentes 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!

¿Aún no eres cliente de IONOS? 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.

¿Habrá complicaciones con los códigos antiguos?

Puesto que PHP 8 es una nueva 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 la página oficial del proyecto PHP puedes encontrar una lista completa con todos los cambios.

Nuevas características de PHP 8

La nueva versión de PHP presenta nuevas características que amplían las posibilidades de los desarrolladores web. A continuación, te presentamos los cambios más importantes con respecto a versiones anteriores.

Compilador JIT

La mayor novedad es el compilador JIT, que ha mejorado considerablemente el rendimiento. PHP no se compila, sino que se interpreta línea por línea. El compilador JIT (Just in Time) compila parte del código durante el tiempo de ejecución, por lo que funciona de manera muy similar a una versión en caché del código.

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 %.

Tipos de unión (Union Types)

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 return type)

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

WeakMap

En PHP 7.4 ya aparecían los WeakRefs y PHP 8 ofrece con WeakMaps 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)

Stringable interface se añade automáticamente a las clases que implementan el método _toString(). Hasta ahora, este paso debía hacerse manualmente. 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');

Función fdiv()

Con la nueva función fdiv() es posible una división por 0. Ahora se obtiene INF, -ING o NAN como valor de retorno.

Anotaciones de tipo (Type annotations)

En PHP 8 se incluyen anotaciones de tipo correctas para todas las funciones y métodos internos.

Errores de tipo (Type errors)

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

Reclassified engine warnings

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

@ ya no suprimirá los errores fatales

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

Firmas correctas de métodos mágicos

En versiones anteriores de PHP, se podía escribir métodos mágicos con firmas que no coincidían con la firma esperada, por ejemplo __clone(): float o __isset(): Closure. Desde el lanzamiento de PHP 7.0, solo se comprobaba de forma aleatoria el uso correcto de los métodos mágicos. En la nueva versión se han incluido varios controles de parámetros y valores de retorno para garantizar que las firmas son correctas.

Reflection

Las firmas Reflection se han cambiado. Anteriormente, Reflection se presentaba de la siguiente manera:

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

En PHP 8, se escribe tal que:

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

Para utilizar PHP 7 y PHP 8 simultáneamente, puedes formular el código como sigue:

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

¡No te vayas! ¡Tenemos algo para ti!
Consigue tu dominio .es 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 IVA incl.
después 10 €/año IVA incl.