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 produjo una gran actualización en el lenguaje de código abierto. Después de un año, otra pequeña actualización, la 8.1, está aquí.

¿Qué características presenta PHP 8.1?

PHP 8.1 ha sido lanzado en versión beta y está siendo probado en la actualidad. La actualización definitiva no llegará hasta noviembre de 2021, pero ya se conocen las novedades:

  • Enum: Las llamadas enumeraciones (enumeraciones con número determinado de valores) están ahora disponibles como tipo variable.
  • Fibers: El nuevo tipo de bloque de código fibers te ofrece la posibilidad de ejecutar múltiples hilos de programa en paralelo.
  • Arrays: Desde PHP 7.4 se pueden desempaquetar arrays con valores numéricos. Ahora esto también es posible para las matrices con cadenas.
  • Readonly: A partir de ahora, las propiedades de las clases pueden marcarse como de solo lectura ('readonly'), y, por tanto, ya no son modificables.
  • Intersección: Los tipos de intersección (básicamente los homólogos de los tipos de unión) están ahora disponibles.
  • Never: El nuevo valor de retorno 'never' indica que una función se termina y no devuelve ningún otro valor.
  • Final: Ahora puedes marcar las constantes de la clase con 'final' para que no puedan ser modificadas por las subclases.
  • Fsync: PHP 8.1 introduce las dos funciones 'fsync' y 'fdatasync' para sincronizar los datos del buffer al medio de almacenamiento.
  • Octal: Para indicar el sistema numérico octal, además del '0' (cero), se puede utilizar en el futuro el prefijo '0o' (cero y O minúscula).
  • Globals: El uso de '$GLOBALS' ha sido ligeramente restringido y ahora resulta en un mensaje de error en algunos casos.
  • Null: Las funciones internas ya no aceptarán valores nulos en argumentos no anulables.
Nota

Esta es solo una selección de los cambios más interesantes de PHP 8.1. Se pueden encontrar muchas más novedades en el wiki oficial con todos los comentarios.

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 suspendió 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!

¡Ya puedes probar PHP 8! ¿Aún no eres cliente de IONOS? Entonces reserva ahora 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 y adquirir PHP 8 o PHP 8.1 (tan pronto como esté disponible).

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

Nota

Microsoft ha anunciado que la compañía ya no ofrecerá compatibilidad de Windows para PHP 8 y versiones posteriores. Sin embargo, los desarrolladores de PHP ya han anunciado su intención de solucionar el problema.

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.

Nota

El 30 de noviembre de 2020, PHP 7.2 llegará a su fecha oficial de fin de vida (EOL) y dejará de ser compatible. Para más información, consulta nuestro artículo sobre este tema.

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.

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.

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

¿Todavía no tienes tu propia página web? El alojamiento web de IONOS es potente y adecuado para principiantes. También ofrecen mucha flexibilidad con el mejor rendimiento los servidores virtuales de IONOS. Elige la oferta que mejor se adapte a tu proyecto.

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continua navegando, consideramos que acepta su uso. Puede obtener más información, o bien conocer cómo cambiar la configuración de su navegador en nuestra. Política de Cookies.