PHP Conference Japan 2024

Enumerações básicas

Enums são similares às classes, e compartilham o mesmo namespaces que as classes, interfaces, e traits. Elas também podem ser carregadas automaticamente da mesma maneira. Uma Enum 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 enum 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 enum 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 enum.

Esse tipo de caso, sem dados relacionados, é chamado de "Caso Puro". Uma Enum que contém apenas Casos Puros é chamada de Pure Enum (enum 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 enum se o nome for obtido dinamicamente. Isto é desencorajado, já que utilizar Backed enums funciona para a maioria dos casos.

adicione uma nota

Notas Enviadas por Usuários (em inglês)

Não há notas de usuários para esta página.
To Top