PHP 8.5.6 Released!

Enumeraciones básicas

Las enumeraciones son similares a las clases y comparten los mismos espacios de nombres que las clases, interfaces y traits. También son autocargables de la misma manera. Una enumeración define un nuevo tipo, que tiene un número fijo y limitado de valores legales posibles.

<?php
enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

Esta declaración crea un nuevo tipo enumerado llamado Suit, que tiene cuatro y solo cuatro valores legales: Suit::Hearts, Suit::Diamonds, Suit::Clubs, y Suit::Spades. Las variables pueden ser asignadas a uno de esos valores legales. Una función puede ser comprobada de tipo contra un tipo enumerado, en cuyo caso solo se pueden pasar valores de ese tipo.

<?php
enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

function
pick_a_card(Suit $suit)
{
var_dump($suit);
}

$val = Suit::Diamonds;

// OK
pick_a_card($val);

// OK
pick_a_card(Suit::Clubs);

// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');

Una enumeración puede tener cero o más definiciones de case, sin máximo. Una enumeración sin casos es sintácticamente válida, aunque bastante inútil.

Para los casos de enumeración, se aplican las mismas reglas sintácticas que a cualquier etiqueta en PHP, ver Constantes.

Por omisión, los casos no están respaldados intrínsecamente por un valor escalar. Es decir, Suit::Hearts no es igual a "0". En su lugar, cada caso está respaldado por un objeto singleton de ese nombre. Eso significa que:

<?php
enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

$a = Suit::Spades;
$b = Suit::Spades;

if (
$a === $b) {
print
"Los palos coinciden usando ===\n";
}

if (
$a instanceof Suit) {
print
"Los palos coinciden usando instanceof\n";
}

if (
$a !== 'Spades') {
print
"El palo no coincide con la cadena\n";
}

También significa que los valores de enumeración nunca son < o > entre sí, ya que esas comparaciones no tienen significado en los objetos. Esas comparaciones siempre devolverán false al trabajar con valores de enumeración.

Este tipo de caso, sin datos relacionados, se denomina "Caso Puro". Una enumeración que contiene solo Casos Puros se denomina Enumeración Pura.

Todos los Casos Puros se implementan como instancias de su tipo de enumeración. El tipo de enumeración está representado internamente como una clase.

Todos los Casos tienen una propiedad de solo lectura, name, que es el nombre sensible a mayúsculas y minúsculas del caso en sí.

<?php
enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

print
Suit::Spades->name;
// imprime "Spades"

También es posible usar las funciones defined() y constant() para verificar la existencia o leer un caso de enumeración si el nombre se obtiene dinámicamente. Sin embargo, esto se desaconseja ya que el uso de Enumeraciones respaldadas debería funcionar para la mayoría de los casos de uso.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top