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());
}
?>