PHP 8: Lanzamiento, características y mejoras

PHP 8
4.2
(11)

El pasado 26 de noviembre el equipo de desarrollo de PHP lanzó una actualización mayor del lenguaje de programación más utilizado en el mundo web: PHP 8.

Al tratarse de una actualización mayor, PHP 8 incorpora cambios muy importantes, especialmente mejoras en cuanto a rendimiento, velocidad y seguridad.

Y un lanzamiento tan importante no merece menos que un artículo completo para desgranar todas las funcionalidades y características que  veremos en esta nueva versión.

¿Vamos a ello?

Características y mejoras de PHP 8

PHP se ha modernizado, es un hecho. Como ya te he adelantado, esta última actualización de PHP 8 promete muchas mejoras en cuanto a rendimiento y seguridad.

Yo en este post voy a mostrarte las más significativas (tampoco quiero aburrir 😅 ), pero en la página oficial de PHP tienes toda la información, así como los RFC que han hecho posible el lanzamiento de esta nueva versión.

Compilador JIT

Una de las mayores novedades que incorpora la última versión de PHP es el compilador JIT (Just in Time Compiler). Esta nueva funcionalidad, que ya estuvo a punto de lanzarse con PHP 7.4, supone un gran cambio en este lenguaje de programación prometiendo grandes mejoras en cuanto a rendimiento.

Como sabes, PHP está equipado con una máquina virtual llamada Zend VM encargada de leer y ejecutar el código PHP, pero para que esto sea posible es necesario que Opcode lea y traduzca ese código en el lenguaje de Zend VM.

Por tanto, para que se ejecute PHP necesitamos dos cosas:

  • Un traductor (Opcode)
  • Máquina que lo ejecute (Zend VM)

Para que este proceso sea lo más rápido posible, Opcode utiliza OPCache (Opcode Cache), almacenando los resultados de la fase de compilación para no tener así que volver a compilar.

Con JIT este funcionamiento cambia completamente. Este componente se encarga de compilar el código en el momento de ejecución y ya no es necesario un traductor que lo envíe a Zend VM. ¿Qué significa esto? Que se elimina un paso intermedio y la ejecución del código se hace de forma más rápida. Especialmente beneficioso para aplicaciones que consumen mucha CPU.

Por defecto, este componente de PHP vendrá desactivado, pero puede habilitarse fácilmente modificando el archivo php.ini de tu plan de hosting.

Union Types o Tipos de unión

Hasta la versión de PHP 8 no se admiten tipos de unión arbitrarios, únicamente son válidos dos tipos de unión especiales:

  • Type o null, utilizando la sintaxis ?Type
  • Array o Traversable, utilizando iterable type

Y, como alternativa, se debían utilizar anotaciones phpdoc como las que se muestran en este ejemplo del RFC:

class Number {
    /**
     * @var int|float $number
     */
    private $number;
 
    /**
     * @param int|float $number
     */
    public function setNumber($number) {
        $this->number = $number;
    }
 
    /**
     * @return int|float
     */
    public function getNumber() {
        return $this->number;
    }
}

Debido a que el uso de tipos de unión está muy extendido en el ámbito open source y también en la librería de PHP, la nueva versión de PHP 8 tendrá soporte para los tipos de unión en las firmas de las funciones, permitiendo así ahorrar bastante código.

Estos tipos de unión se especifican utilizando la sintaxis T1 | T2 |. Por ejemplo:

class Number {
    private int|float $number;
 
    public function setNumber(int|float $number): void {
        $this->number = $number;
    }
 
    public function getNumber(): int|float {
        return $this->number;
    }
}

Eso sí, aunque se admiten todos los tipos de unión, hay algunas limitaciones:

  • Void type: El tipo void indica que la función no tiene valor de retorno, por lo que no puede formar parte de una unión.
  • Nullable union types: El tipo nulo se admite como parte de las uniones, pero no se puede utilizar de forma independiente. Tampoco se pueden combinar los tipos de unión y la notación de tipos que aceptan valores NULL? T. Es decir, no se permite utilizar T1 | T2, T1 |? T2 o? (T1 | T2), s ino que debería ser T1 | T2 | null.
  • Pseudo-tipo false: PHP 8 tiene soporte para el pseudo-tipo false, aunque no se puede utilizar como un tipo independiente.
  • Tipos redundantes y duplicados: sin realizar la carga de clases, se detectan tipos redundantes o duplicados generarán un error en el tiempo de compilación.

Match expression

PHP 8 incorpora una nueva extensión similar a switch, pero con tres grandes diferencias.

  • Más segura: los valores se comparan estrictamente  (===), en lugar de la verificación de igualdad de las expresiones switch (==).
  • Devuelve valores: A diferencia de las expresiones switch, las expresiones de coincidencia o match expressions sí devuelven valores.

Attributes o atributos

A partir de la versión 8 de PHP será posible añadir atributos, es decir, anotaciones (meta datos) sin tener que utilizar bloques de comentarios.

Para ello, será necesario crear un atributo, como si fuese una clase, con el formato << >>, reutilizando los tokens existentes T_SL y T_SR. Tal y como se establece en el RFC, un ejemplo de atributo se vería así:

namespace My\Attributes;
 
use PhpAttribute;
 
<<PhpAttribute>>
class SingleArgument
{
    public $value;
 
    public function __construct(string $value)
    {
        $this->value = $value;
    }
}

Weak Maps

Basados en las Weak References de PHP 7.4, en PHP 8 se introducen los Weak Maps, que permiten crear un mapa de objetos a valores arbitrarios sin evitar que esos objetos sean eliminados por el garbage collector.

El hecho de que los objetos de un Weak Map se puedan recolectar como basura puede ser muy interesante para librerías encargadas de cachear objetos, ya que permiten liberar memoria de forma más eficiente cuando ya no haya nada más que haga referencia a ellos.

Un ejemplo de Weak Map recogido por el RFC para un resultado de cálculo sería el siguiente:

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

Constructor Property Promotion

Esta funcionalidad de PHP 8 permite simplificar el código que escribimos por versiones más cortas. Esto permite tener un código mucho más limpio, legible y simple.

Tal y como se establece en el RFC, podríamos pasar de esta forma:

class Point {
    public float $x;
    public float $y;
    public float $z;
 
    public function __construct(
        float $x = 0.0,
        float $y = 0.0,
        float $z = 0.0,
    ) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }
}

A esta otra:

class Point {
    public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
    ) {}
}

Estas dos formas equivalen exactamente a lo mismo, pero es mucho más concisa y fácil de interpretar, ¿verdad?

Uso de ::class en los objetos

Otra forma de sintetizar el código es aplicando directamente ::class a los objetos en lugar de get_class(), como hasta ahora.

Stringable interface o interfaz para cadenas

Otra de las mejoras de PHP 8 es la implementación automática de Stringable interface a las clases que implementan el método __toString(), sin necesidad de hacerlo a mano.

Type errors o errores de tipo

Hasta PHP 8, solo las funciones definidas por el usuario arrojaban los TypeErrors, las funciones internas emitían advertencias y devolvían el valor null. Ahora, el comportamiento de estas funciones

Named arguments o argumentos de nombre

Los Named arguments permiten pasar datos de entrada a una función con el nombre del parámetro, en vez de hacerlo con su posición.

Esto hace que los Name arguments sean independientes del orden y también permite omitir valores predeterminados de forma aleatoria. Por ejemplo:

// Utilizando argumentos de posición:
array_fill(0, 100, 50);
// Utilizando argumentos de nombre:
array_fill(start_index: 0, num: 100, value: 50);

De esta forma, el orden en el que se establecen los argumentos no es decisivo, sino que se podrían utilizar en cualquier otra posición:

array_fill(value: 50, num: 100, start_index: 0);

Además, también es posible combinar argumentos de nombre con argumentos de posición o especificar únicamente los que necesites, independientemente del orden en cómo los establezcas:

htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

¿Y qué ocurre con mi versión actual de PHP?

Seguro que no es la primera vez que te lo decimos, es muy importante trabajar con las versiones más recientes de un software. Normalmente, cuando se liberan actualizaciones, se corrigen problemas de seguridad que podrían afectar a tu proyecto.

Por tanto, no es nada recomendable que a día de hoy trabajes con una versión obsoleta de PHP. De hecho, una de las versiones más utilizadas en la actualidad, PHP 7.1, ya no tiene soporte y PHP 7.2 hace pocos días que lo dio por finalizado. Así que, es importante actualizarlo.

Por no hablar de esas webs o aplicaciones que utilizan versiones como la 5.4 o 5.5…

Si utilizas PHP 7.3 o 7.4, no tienes de qué preocuparte. Por el momento hay soporte para estas versiones, aunque tampoco es recomendable alargar estas versiones durante mucho más tiempo.

Una de las cosas que debes tener en cuenta si quieres cambiar la versión de PHP con la que trabaja tu web, es que algunas de las características puede que no sean compatibles. Eso sí, si has mantenido el código actualizado, no deberías tener problema.

PHP 8 ya disponible en nuestros servidores

Ya sabes que en LucusHost trabajamos con la última tecnología y mantenemos todo al día, así que… ¡Ya está disponible PHP 8 en todos nuestros planes de hosting!

Esto no quiere decir que vayamos a actualizar tu aplicación automáticamente (ni mucho menos), solo queremos que tengas la posibilidad de elegir la versión de PHP que tú quieras. Si no sabes muy bien cómo hacerlo o necesitas ayuda, estas dos guías te vendrán de perlas:

¿Alguna duda a la hora de seleccionar PHP 8? Nuestro equipo de soporte técnico está disponible 24×7 para echarte una mano en todo lo que necesites 🙂 .

¡Puntúa este artículo!

Total votos: 11. Promedio: 4.2

2 Comentarios
  • Ivan
    Posted at 21:08h, 17 diciembre Responder

    Muy buen articulo,

    Veo que a mi todavía no me aparece esa nueva versión en mi cuenta que tengo con ustedes, (Actualmente tengo el 7.4)

    Supongo que tocará esperar un poco.

    Gracias por compartirlo.

    • María Acibeiro
      Posted at 17:07h, 18 diciembre Responder

      La sacaremos muy pronto y estará disponible desde el selector de versiones de cPanel 🙂

Escribe un comentario