# 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](https://www.ionos.es/digitalguide/paginas-web/creacion-de-paginas-web/tutorial-de-php-fundamentos-basicos-para-principiantes/ "Tutorial de PHP: fundamentos básicos para principiantes") 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](https://wiki.php.net/rfc/enumerations "RFC oficial sobre enums"): Las llamadas enumeraciones (enumeraciones con número determinado de valores) están ahora disponibles como tipo variable.
- [Fibers](https://wiki.php.net/rfc/fibers "RFC oficial sobre fibers"): El nuevo tipo de bloque de código fibers te ofrece la posibilidad de ejecutar múltiples hilos de programa en paralelo.
- [Arrays](https://wiki.php.net/rfc/array_unpacking_string_keys "RFC oficial sobre 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](https://wiki.php.net/rfc/readonly_properties_v2 "RFC oficial sobre 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](https://wiki.php.net/rfc/pure-intersection-types "RFC oficial sobre tipos de intersección"): Los tipos de intersección (básicamente los homólogos de los tipos de unión) están ahora disponibles.
- [Never](https://wiki.php.net/rfc/noreturn_type "RFC oficial del never return type"): El nuevo valor de retorno 'never' indica que una función se termina y no devuelve ningún otro valor.
- [Final](https://wiki.php.net/rfc/final_class_const "RFC sobre la final flag"): Ahora puedes marcar las constantes de la clase con 'final' para que no puedan ser modificadas por las subclases.
- [Fsync](https://wiki.php.net/rfc/fsync_function "RFC oficial sobre fsync"): PHP 8.1 introduce las dos funciones 'fsync' y 'fdatasync' para sincronizar los datos del buffer al medio de almacenamiento.
- [Octal](https://wiki.php.net/rfc/explicit_octal_notation "RFC oficial sobre octa"): 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](https://wiki.php.net/rfc/restrict_globals_usage "RFC oficial sobre $GLOBALS"): El uso de '$GLOBALS' ha sido ligeramente restringido y ahora resulta en un mensaje de error en algunos casos.
- [Null](https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg "RFC oficial sobre 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](https://wiki.php.net/rfc "Wiki de PHP").

---

## 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](https://www.ionos.es/alojamiento/alojamiento-web "Alojamiento web – IONOS"). En tu cuenta de cliente de IONOS, podrás [cambiar la versión actual de PHP](https://www.ionos.es/ayuda/hosting/gestionar-la-version-de-php/ver-o-cambiar-la-version-de-php "Cambiar la versión de PHP en cuenta IONOS") 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](https://wiki.php.net/rfc/deprecations_php_7_2 "Características obsoletas de PHP 7.2"), [7.3](https://wiki.php.net/rfc/deprecations_php_7_3 "Características obsoletas de PHP 7.3") y [7.4](https://wiki.php.net/rfc/deprecations_php_7_4 "Características obsoletas de PHP 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](https://www.php.net/releases/8.0/es.php "php.net: PHP 8.0.0 Release Announcement") 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](https://levelup.gitconnected.com/how-fast-is-php-8-going-to-be-f7fdc111cd6 "Prueba del compilador JIT"). 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:

<table>
  <thead>
    <tr>
      <th>Versión</th>
      <th>Tiempo en segundos</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>5.3</td>
      <td>0,64574003219604</td>
    </tr>
    <tr>
      <td>7.4</td>
      <td>0,10253500938416</td>
    </tr>
    <tr>
      <td>8 (sin JIT)</td>
      <td>0,098223924636841</td>
    </tr>
    <tr>
      <td>8 (con JIT)</td>
      <td>0,053637981414795</td>
    </tr>
  </tbody>
</table>

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:

```none
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:

```none
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 &amp; 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:

```none
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:

```none
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](https://wiki.php.net/rfc/engine_warnings "Listado oficial de avisos 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:

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

En PHP 8, se escribe tal que:

```none
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:

```none
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](https://www.ionos.es/alojamiento/alojamiento-web "Alojamiento web – IONOS") de IONOS es potente y adecuado para principiantes. También ofrecen mucha flexibilidad con el mejor rendimiento los [servidores virtuales](https://www.ionos.es/servidores/vps "Contrata servidores virtuales económicos – Windows o Linux – IONOS") de IONOS. Elige la oferta que mejor se adapte a tu proyecto.

---


This is a markdown version of: [https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/php-8/](https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/php-8/) for AI/LLM consumption.