A partir de PHP 8.1, el tipo de datos Enum puede ser usado para definir valores de enumeración exactos para una lista. Esto es útil para los casos en los que sabemos que el valor de una variable sólo puede tomar unos pocos valores específicos.
Por ejemplo, así es como almaceno los tipos de notificación:
enum OrderNotificationType: string{case Email = 'correo electrónico';case Sms = 'texto';}
En PHP, el tipo de datos Enum es un objeto clásico que se comporta como un tipo especial de constante, pero también tiene una instancia que puede ser pasada. Sin embargo, a diferencia de un objeto normal, está sujeto a una serie de restricciones.
Aunque los enums están construidos sobre clases y objetos, no soportan toda la funcionalidad relacionada con los objetos. En particular, se prohíbe que los objetos enum tengan estado interno (deben ser siempre una clase estática).
Una lista específica de diferencias:
Las siguientes características del objeto están disponibles y se comportan como cualquier otro objeto:
TARGET_CLASS
incluye los propios Enums. El filtro de destino TARGET_CLASS_CONST
incluye casos Enum.__call
, __callStatic
y __invoke
.__CLASS__
y __FUNCTION__
se comportan como constantes normales::class
en el tipo Enum se evalúa como el nombre completo del tipo de datos, incluyendo cualquier espacio de nombres, exactamente como para un objeto. La constante mágica ::class
en una instancia de tipo Case
también se evalúa como tipo Enum, ya que es una instancia de un tipo diferente.Imagina que tenemos un enum que representa los tipos de trajes. En este caso, sólo tenemos que definir el tipo Suit
y almacenar los valores válidos individuales.
Entonces obtenemos una instancia de la opción particular clásicamente a través de una cuadrática, como cuando se trabaja con una constante estática.
Ejemplo de definir un Enum, invocarlo por un tipo específico y pasarlo a una función:
enum Suit{case Hearts;case Diamonds;case Clubs;case Spades;}function doStuff(Suit $s){// ...}doStuff(Suit::Spades);
La ventaja fundamental de los enums sobre los objetos y las constantes es que es fácil comparar sus valores.
La comparación básica con la que trabajamos con un valor específico se puede hacer de la siguiente manera:
$a = Suit::Spades;$b = Suit::Spades;$a === $b; // verdadero
Muy a menudo también tenemos que decidir que un valor concreto pertenece a una enumeración de valores Enum válida. Esto se puede comprobar fácilmente de la siguiente manera:
$a = Suit::Spades;$a instanceof Suit; // verdadero
Podemos leer un valor de tipo específico como nombre de una constante de llamada o directamente como un valor real definido (si existe):
enum Colors{case Red;case Blue;case Green;public function getColor(): string{return $this->name;}}function paintColor(Colors $colors): void{echo "Pintura:" . $colors->getColor();}
El valor de la constante de llamada se lee a través de la propiedad nombre
. También es importante que se pueda implementar una función personalizada directamente en el tipo de datos Enum, que pueda ser llamada sobre cada Enum.
Si un Enum en particular también implementa valores reales (que están ocultos bajo cada constante), su valor también puede ser leído:
enum OrderNotificationType: string{case Email = 'correo electrónico';case Sms = 'texto';}$type = OrderNotificationType::Email;echo $type->value;
A menudo necesitamos listar (por ejemplo, al usuario en un mensaje de error) todos los posibles valores que puede tomar el Enum. Cuando se usaban constantes esto no era posible, Enum lo permite fácilmente:
Suit::cases();
Devuelve [Traje::Corazones, Traje::Diamantes, Traje::Tréboles, Traje::Picas]
.
Podemos verificar fácilmente que una determinada variable desconocida contiene un Enum mediante una condición:
if ($haystack instanceof \BackedEnum) {
Cada objeto Enum es automáticamente un hijo de la interfaz genérica \BackedEnum
.
Para más información, consulte la discusión en el GitHub de PhpStan: https://github.com/phpstan/phpstan/issues/7304
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | es