PHP 8 vs PHP 7: ¿Qué cambió con la última actualización?

PHP ha sido siempre uno de los lenguajes de programación más sencillos de aprender, y en general, el que más “le suena” a los no expertos en la materia, por su gran popularidad.
No es difícil comenzar a escribir scripts y ejecutar comandos, siempre y cuando tengas la motivación adecuada. Hace poco, PHP lanzó su versión 8.1, y en LatinCloud te contamos qué novedades trajo está actualización.

¿Qué hay de nuevo en PHP 8.1?

PHP 8.1 trae consigo muchas novedades que facilitan y optimizan su uso para expertos y novatos. Te trajimos una lista con definiciones directas de la wiki de PHP.

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

A continuación, te detallaremos algunas de las novedades más fascinantes de PHP 8.1

Pero antes, un dato interesante: ¿Sabías que no es necesario ser un programador experto para tener control de tu propio sitio web? En LatinCloud ofrecemos hosting web con adaptación a WordPress y otras herramientas que facilitan la creación y mantenimiento de tu web.

Ahora sí, atentos a estas novedades de primera.

Compilador JIT

El compilador JIT es un verdadero “HIT” *guiño guiño*, esto se debe a 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 o Justo a Tiempo) compila parte del código durante el tiempo de ejecución, esto hace que su funcionamiento sea similar a una versión en caché del código.

Esta característica de PHP 8 fue puesta a prueba por Pedro Escudero.
Pedro utilizó un script simple para comparar las versiones 5.3, 7.4 y 8 (con y sin JIT). Esta prueba implicó la ejecución del script cien veces en cada versión más el cálculo del tiempo promedio.

El resultado dio los siguientes valores:

VersiónTiempo en segundos
5.30,64574003219604
7.40,10253500938416
8 (sin JIT)0,098223924636841
8 (con JIT)0,053637981414795

¿Qué significa? Que el compilador JIT proporciona una mejora del rendimiento de más del 45 %.

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

PHP 8 suma a los WeakMaps de sus antepasados, 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.
Con esto, conseguimos una administración de los objetos que ahorra recursos. Por ejemplo:

class FooBar {

    private WeakMap $cache;

    public function getSomethingWithCaching(object $obj) {

        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);

    }

    // ...

}

Tipos de unión (Union Types)

Los union types permiten, como el nombre nos indica, 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;

Pero no todo es color de rosa, existe una limitación llamada Void.
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;

Usar ::class en los objetos

En versiones previas a la 8.1, debiamos 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.

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)

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

Reclassified engine warnings

Solía haber muchos errores que sólo emitían un aviso. Esto se ha actualizado. Acá te dejamos 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ían escribir métodos mágicos con firmas que no coincidían con la firma esperada, por ejemplo __clone(): float o __isset(): Closure. En la nueva versión se incluyeron varios controles de parámetros y valores de retorno para garantizar que las firmas son correctas.

Reflection

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

ReflectionClass::newInstance($args);

ReflectionFunction::invoke($args);

ReflectionMethod::invoke($object, $args);

En PHP 8, se escribe así:

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

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 asi:

class Foo

{

    public function __toString(): string

    {

        return 'foo';

    }

}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());

bar('abc');

Códigos Antiguos: ¿Qué podemos esperar con la actualización?

Ya que PHP 8 pasó a ser la versión principal de este lenguaje, hay que tener en cuenta que algunos códigos antiguos no son compatibles. La mayoría de los cambios que podrían presentar complicaciones ya estaban obsoletos en versiones anteriores.

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 mantuviste tu código actualizado hasta ahora, no vas a tener ningún problema, a pesar de que la nueva actualización tiene cambios incompatibles con versiones anteriores. En la página oficial del proyecto PHP puedes encontrar una lista completa con todos los cambios.

¡Felicidades! Acabas de informarte ampliamente sobre PHP 8, logrando un paso más en tu viaje de programación. Si te apasiona el tema, podemos recomendarte otras notas relacionadas como nuestro informe acerca del framework estrella “Laravel”.


Elizabeth De Bonis

Elizabeth De Bonis es una escritora y creadora de contenido, especializada en Marketing Digital. Su pasión por el Marketing la vuelve proactiva a la hora de encontrar tópicos para cada nota que redacta. La investigación previa a la redacción de cada pieza, es una de sus partes favoritas como copywriter de LatinCloud.