Lo nuevo de PHP 8.1
— php, 8.1, cambios — 5 minutos de lectura
PHP 8.1 se lanzó el pasado 25 de noviembre de 2021. Ya pasó un tiempo pero vale la pena rescatar que esta versión trae consigo varias mejoras y novedades que harán la vida más fácil a los desarrolladores y a los usuarios. En este artículo vamos a repasar algunas de las más destacadas.
Enumeraciones
Las enumeraciones son un tipo de dato que permite definir un conjunto finito y ordenado de valores constantes, que se pueden usar como alternativa a las constantes globales o a las clases con propiedades estáticas. Las enumeraciones facilitan la legibilidad y la seguridad del código, ya que evitan errores de escritura o de asignación de valores no válidos.
Las enumeraciones se definen con la palabra reservada enum
, seguida del nombre y del tipo de los valores (que puede ser int
o string
). Dentro de las llaves se especifican los valores posibles, separados por comas. Por ejemplo:
1enum Status: string2{3 case DRAFT = 'draft';4 case PUBLISHED = 'published';5 case ARCHIVED = 'archived';6}
Para acceder a los valores de una enumeración se usa el operador ::
, como si fuera una clase. Por ejemplo:
1$status = Status::DRAFT;2echo $status->value; // 'draft'3echo $status->name; // 'DRAFT'
Las enumeraciones también pueden tener métodos, que se definen dentro de las llaves después de los valores. Por ejemplo:
1enum Status: string2{3 case DRAFT = 'draft';4 case PUBLISHED = 'published';5 case ARCHIVED = 'archived';6
7 public function isEditable(): bool8 {9 return $this === Status::DRAFT;10 }11}
Readonly properties
Las propiedades de solo lectura son aquellas que solo se pueden asignar una vez, en el constructor de la clase o en la declaración de la propiedad. Esto evita que se modifiquen accidentalmente o intencionadamente después de su inicialización, lo que mejora la inmutabilidad y la consistencia de los objetos.
Las propiedades de solo lectura se declaran con el modificador readonly
antes del modificador de visibilidad (public
, protected
o private
). Por ejemplo:
1class User2{3 public readonly int $id;4 public readonly string $name;5
6 public function __construct(int $id, string $name)7 {8 $this->id = $id;9 $this->name = $name;10 }11}
Si se intenta modificar una propiedad de solo lectura después de su asignación inicial, se produce un error fatal. Por ejemplo:
1$user = new User(1, 'Alice');2$user->name = 'Bob'; // Fatal error: Uncaught Error: Cannot modify readonly property User::$name
El operador match
El operador match
de PHP 8.1 es una nueva característica que permite escribir expresiones condicionales de forma más compacta y legible que el switch
. El operador match
evalúa una expresión y compara su valor con una lista de opciones, devolviendo el valor asociado a la primera opción que coincida. A diferencia del switch
, el operador match
no requiere usar break
para evitar la ejecución de las opciones siguientes, y soporta comparaciones estrictas y uniones de tipos.
1// Usando switch2$color = 'red';3switch ($color) {4 case 'red':5 case 'green':6 case 'blue':7 $rgb = true;8 break;9 default:10 $rgb = false;11}12
13// Usando match14$color = 'red';15$rgb = match ($color) {16 'red', 'green', 'blue' => true,17 default => false,18};
Operador nullsafe
El operador nullsafe de PHP 8.1 es una nueva característica que permite acceder a propiedades o métodos de objetos que pueden ser nulos sin provocar un error. El operador nullsafe consiste en usar el símbolo ?->
en lugar de ->
para indicar que si el objeto es nulo, se devuelva nulo en lugar de lanzar una excepción. Esto evita tener que usar múltiples comprobaciones de nulidad o el operador de fusión null (??
) para evitar errores.
1// Sin el operador nullsafe2$user = getUserById($id);3if ($user !== null) {4 $address = $user->getAddress();5 if ($address !== null) {6 $country = $address->country;7 }8}9
10// Con el operador nullsafe11$user = getUserById($id);12$country = $user?->getAddress()?->country;
Final class constants
Las constantes de clase final son aquellas que no se pueden sobrescribir en las clases hijas. Esto evita que se modifique el valor original de la constante, lo que puede causar inconsistencias o errores en el código.
Las constantes de clase final se declaran con el modificador final
antes del modificador const
. Por ejemplo:
1class A2{3 final const FOO = 'foo';4}5
6class B extends A7{8 const FOO = 'bar'; // Fatal error: Cannot override final constant A::FOO9}
En este ejemplo, la constante FOO
de la clase A
es final, por lo que no se puede sobrescribir en la clase B
. Si se intenta hacerlo, se produce un error fatal.
Las constantes de clase final pueden ser útiles para definir valores que no deben cambiar en las subclases, como por ejemplo identificadores únicos o configuraciones globales.
Otros cambios
Además de las características mencionadas anteriormente, PHP 8.1 también incluye otros cambios menores o experimentales, como:
- La sintaxis
new Foo[]
para crear arrays de objetos. - El modificador
never
para indicar que una función o método nunca retorna. - El atributo
#[Deprecated]
para marcar elementos obsoletos. - El operador
throw
para lanzar excepciones como expresiones. - El atributo
#[Pure]
para indicar que una función o método no tiene efectos secundarios. - El atributo
#[Immutable]
para indicar que una clase o propiedad es inmutable.
Puedes consultar la lista completa de cambios en el sitio oficial de PHP.
Conclusión
PHP 8.1 es una versión muy interesante y esperada por muchos desarrolladores, que trae consigo varias mejoras y novedades que harán la vida más fácil a los desarrolladores y a los usuarios. En este artículo hemos repasado algunas de las más destacadas, como las enumeraciones, las propiedades de solo lectura, las fibras, los tipos de intersección y las constantes de clase final.
Esperamos que este artículo te haya resultado útil e interesante. Si te ha gustado, compártelo con tus amigos y déjanos un comentario con tu opinión o tus dudas. ¡Hasta la próxima!