Ejemplos

Ejemplo #1 Valores limitados básicos

<?php

enum SortOrder
{
case
Asc;
case
Desc;
}

function
query($fields, $filter, SortOrder $order = SortOrder::Asc)
{
/* ... */
}
?>

La función query() acepta un parámetro $order que debe ser de tipo SortOrder que garantiza que solo puede ser SortOrder::Asc o SortOrder::Desc. Cualquier otro valor resultará en un TypeError, por lo que no se necesita más comprobación o prueba de errores.

Ejemplo #2 Valores exclusivos avanzados

<?php

enum UserStatus: string
{
case
Pending = 'P';
case
Active = 'A';
case
Suspended = 'S';
case
CanceledByUser = 'C';

public function
label(): string
{
return match(
$this) {
self::Pending => 'Pending',
self::Active => 'Active',
self::Suspended => 'Suspended',
self::CanceledByUser => 'Canceled by user',
};
}
}
?>

En este ejemplo, el estado de un usuario puede ser uno de, y exclusivamente, UserStatus::Pending, UserStatus::Active, UserStatus::Suspended, o UserStatus::CanceledByUser. Una función puede tipar un parámetro con UserStatus y luego solo aceptar esos cuatro valores, punto.

Todos los valores tienen un método label(), que devuelve una cadena legible por humanos. Esa cadena es independiente de la cadena equivalente escalar "nombre de máquina", que se puede usar en, por ejemplo, un campo de base de datos o un cuadro de selección HTML.

<?php

foreach (UserStatus::cases() as $case) {
printf('<option value="%s">%s</option>\n', $case->value, $case->label());
}
?>