¿Qué son los ENUM en php y para qué se utilizan?
Un ENUM en PHP, que viene de ENUMeration, es un tipo de dato que nos permite definir un conjunto de valores constantes. A estos valores, les llamamos “casos” o “case” en inglés. Podríamos decir también, que un ENUM es un “tipo especial de constante”, ya que por ejemplo, en versiones anteriores de PHP (antes de que se introdujeran formalmente), los ENUM se podían emular usando solo constantes, pero en realidad, un Enum, es un tipo especial de objeto con algunas restricciones.
Como he indicado al principio, “los ENUMs” representan un conjunto de valores constantes, es decir, fijos, por lo que significa que no se pueden añadir nuevos casos dinámicamente en tiempo de ejecución. Además, todos los casos deben tener el mismo tipo de valor, proporcionando así una fuerte restricción de tipos. Esto último lo explicaré más adelante, ahora, después de esta breve introducción, vayamos al grano.
¿Cómo los creo y para que los puedo necesitar?
Por ejemplo, imagínate el siguiente sistema de roles en una aplicación web: usuario, moderador y administrador. Pues bien, podemos empezar por hacer así:
enum Roles { case USUARIO = 'User'; case MODERADOR = 'Mod'; case ADMINISTRADOR = 'Admin'; }
Acabamos de crear un Enum llamado “Roles” que representa los tres posibles roles de una aplicación web. Bien, ahora, ¿cómo lo uso?
Podemos crear una función así:
function acceso(Roles $rol) { if ($rol->name == 'USUARIO') { echo 'Eres un usuario'; } elseif ($rol->name == 'MODERADOR') { echo 'Eres un moderador'; } elseif ($rol->name == 'ADMINISTRADOR') { echo 'Eres el poderoso administrador del sitio ;-)'; } }
Y podemos llamarla así:
$rol = Roles::MODERADOR; acceso($rol);
Fíjate que en los “if”, no usamos $rol directamente, sino $rol->name, ya que esta propiedad de solo lectura y que tienen todos los casos (case), nos devuelve el nombre del caso en sí.
Por otro lado, ejecutando el método Roles::cases() obtenemos la lista de todos los casos. Lo cual puede ser útil para combinarlo con foreach() por ejemplo.
Por cierto, una cosa que podemos pensar hacer es esto:
acceso('MODERADOR');
Pero el hacerlo, da como resultado el siguiente error fatal:
Fatal error: Uncaught TypeError: acceso(): Argument #1 ($rol) must be of type Roles, string given…
También podemos asignarle un valor a cada caso, es decir, hacer algo tipo:
case USUARIO = 'User';
Pero para ello debemos de modificar el Enum de la siguiente manera:
enum Roles: string { case USUARIO = 'User'; case MODERADOR = 'Mod'; case ADMINISTRADOR = 'Admin'; }
Y es aquí donde entra lo que he comentado al principio sobre la restricción de tipos. En el ejemplo anterior, si nos fijamos, cada caso tiene el mismo tipo de valor, es decir, una cadena o string, por eso lo de que… “un ENUM conlleva una fuerte restricción de tipos”, es decir, no podemos hacer que algunos casos sean string y otros int por ejemplo.
Y hasta aquí los ENUM en PHP. Como puedes ver son una opción poderosa cuando necesitamos representar un conjunto fijo de valores, además de ofrecer “claridad” al leer el código 😉
Sobre el autor
Este artículo está publicado bajo una licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional . Puedes compartirlo y adaptarlo, incluso con fines comerciales, siempre que cites al autor y mantengas esta misma licencia.