Enumerações são similares às classes e compartilham o mesmo namespaces que classes, interfaces, e traits. Elas também podem ser carregadas automaticamente da mesma maneira. Uma Enumeração define um novo tipo, que possui um número fixo e limitado de valores legais possíveis.
<?php
enum Naipe
{
case Copas;
case Ouros;
case Paus;
case Espadas;
}
?>
Essa declaração cria um novo tipo enumerado chamado Naipe
, que possui
quatro e apenas quatro valores permitidos: Naipe::Copas
, Naipe::Ouros
,
Naipe::Paus
, e Naipe::Espadas
. Variáveis podem ser atribuídas
a um desses valores permitidos. Uma função pode ser tipada contra um tipo enumerado,
caso em que apenas os valores desse tipo podem ser passados.
<?php
function pegar_uma_carta(Naipe $naipe)
{
/* ... */
}
$val = Naipe::Ouros;
// OK
pegar_uma_carta($val);
// OK
pegar_uma_carta(Naipe::Paus);
// TypeError: pegar_uma_carta(): Argument #1 ($naipe) must be of type Naipe, string given
pegar_uma_carta('Espadas');
?>
Uma enumeração pode ter zero ou mais definições case
, sem limite máximo.
Uma enumeração sem nenhum caso é sintaticamente válida, embora inútil.
Os nomes dos casos seguem as mesmas regras de sintaxe de qualquer nome do PHP, mais detalhados na seção sobre Constantes.
Por padrão, os casos não são internamente associados por um valor escalar. Ou seja, Naipe::Copas
não é igual a "0"
. Ao invés disso, cada caso é apoiado por um objeto único com esse nome. Isso significa que:
<?php
$a = Naipe::Espadas;
$b = Naipe::Espadas;
$a === $b; // true
$a instanceof Naipe; // true
?>
Isso também significa que os valores de enumeração nunca são <
ou >
do que o outro,
uma vez que essas comparações não fazem sentido em objetos. Essas comparações sempre retornarão
false
ao trabalhar com valores de enumeração.
Esse tipo de caso, sem dados relacionados, é chamado de "Caso Puro". Uma enumeração que contém apenas Casos Puros é chamada de Enumeração Pura.
Todos os Casos Puros são implementados como instâncias de seus tipos 'enum'. O tipo 'enum' é representado internamente como uma classe.
Todos os Casos têm uma propriedade somente leitura, name
, que é o nome (sensível a maiúsculas e minúsculas)
do próprio caso.
<?php
print Naipe::Espadas->name;
// imprime "Espadas"
?>
É possível também utilizar as funções defined() e constant() para verificar a existência ou ler um item de enumeração se o nome for obtido dinamicamente. Isto é desencorajado, já que utilizar Enumerações Apoiadas funciona para a maioria dos casos.