Entre las novedades más importantes de PHP 8 se encuentra el soporte para Union Types, o uniones de datos. En el siguiente artículo exploraremos estos cambios.
Previo a PHP 8
Anteriormente solo se podía declarar un solo tipo de dato para las propiedades, parámetros y retornos en PHP. Aunque desde la versión 7.1 se incluyó soporte para declaración de nullable types con la sintaxis ?string
, no existía soporte para unión de datos, por lo que era necesario utilizar largas anotaciones PHPDoc, cómo en el siguiente ejemplo, donde crearemos la clase Number
junto con su propiedad interna y los métodos setNumber()
y getNumber()
, para fijar y recuperar su propiedad respectivamente:
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; } }
En PHP 8
A partir de PHP 8 se permite declarar más de un tipo de dato o respuesta para argumentos, tipos de retorno y y propiedades de clases. PHP se asegurará de que los parámetros, tipos retornados y propiedades de clases pertenezcan a alguno de los tipos declarados en la definición.
PHP ahora soporta tipos escalares, tipos de retorno, nullables y propiedades de clases.
Para declarar una unión de datos se sigue la sintaxis tipo_1|tipo_2
El siguiente ejemplo muestra un caso del uso de unión de tipos, nota cómo ya no es necesario incluir anotaciones PHPDoc en nuestro código:
class Number { private int|float $number; public function setNumber(int|float $number): void { $this->number = $number; } public function getNumber(): int|float { return $this->number; } }
En PHP 8 ya puedes evitar el uso de los comentarios PHPDoc @var
@param
@return
, a favor de los tipos declarados en el código directamente. Lo que sin duda ayudará a reducir la necesidad de colocar «docblocks» y nos permitirá construir código más legible y menos repetitivo.
Aunque ahora puedes declarar cualquier número de tipos arbitrarios para propiedades, argumentos y tipos de retorno, existen algunas excepciones que no tiene sentido usar juntas, como string|void
.
La sintaxis de nullable types existente no ha sido removida ni ha quedado obsoleta. Por lo que puedes continuar usando ?string
como alternativa a string|null
.
Los tipos iterables tampoco serán removidos, y serán funcionalmente equivalentes a array|Traversable
.
Casos Especiales
void
Aunque PHP cuenta con soporte para el tipo void
, este solo se permite como un tipo de retorno, ya que usar void
en algún otro contexto no tendría sentido. Por lo tanto, PHP 8 no permite combinar void
con algún otro tipo al declarar uniones de tipos.
Por ejemplo, la siguiente unión de tipos no está permitida:
// function foo(): void|null { // .... }
false
PHP soporta el uso de false
para indicar que no hay coincidencias. Por ejemplo, si tienes una función que carga el id
de varias cuentas de usuario, podría retornar false
para indicar que una cuenta de usuario no existe. Por lo que está permitido usar false
en uniones de tipos, como vemos a continuación:
function user_load(int $id): User|false { // .... }
También puedes considerar el uso del patrón Patrón Null Object.
Tipos duplicados o redundantes
La declaración de tipos duplicados o redundantes no está permitida y arrojará errores, por ejemplo, al declarar int|INT
que son esencialmente el mismo tipo, al igual que declarar tipos redundantes cómo bool|false
(false
ya es un tipo booleano) o DateTime|object
(los objetos de clase son de tipo object
).
Retrocompatibilidad
El soporte para unión de datos ha sido introducido desde PHP 8 y no presenta ningún problema de compatibilidad con versiones previas, sin embargo, si tu código incluye muchas anotaciones puedes implementar está característica para hacerlo más limpio.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Nuevas funciones de cadena en PHP 8 Lección siguiente Compilación Just-In-Time en PHP 8