PHP 8.5.0 Beta 2 available for testing

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() ahora puede proceder con la seguridad de que $order está garantizado que sea SortOrder::Asc o SortOrder::Desc. Cualquier otro valor habría resultado en un TypeError, por lo que no se necesita ninguna comprobación o prueba de errores adicional.

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 contra UserStatus y luego solo aceptar esos cuatro valores, punto.

Los cuatro valores tienen un método label(), que devuelve un string legible por humanos. Ese string es independiente del string equivalente escalar de "nombre de máquina", que puede usarse 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());
}
?>

add a note

User Contributed Notes 1 note

up
8
php-net at mentordosnerds dot com
1 year ago
Additional use-case examples:
<?php

trait EnumNamesTrait
{
abstract public static function
cases(): array;

public static function
names(): array
{
return
array_map(fn($enum) => $enum->name, static::cases());
}
}

trait
EnumValuesTrait
{
abstract public static function
cases(): array;

public static function
values(): array
{
return
array_map(fn($enum) => $enum->value, static::cases());
}
}

trait
EnumArraySerializableTrait
{
use
EnumNamesTrait;
use
EnumValuesTrait;

public static function array(): array
{
return
array_combine(static::names(), static::values());
}
}

trait
EnumJsonSerializableTrait
{
use
EnumArraySerializableTrait;

public static function
jsonSerialize(): string
{
return
json_encode(static::array());
}
}

enum
Suit: string
{
case
Clubs = '♣';
case
Diamonds = '♦';
case
Hearts = '♥';
case
Spades = '♠';

use
EnumJsonSerializableTrait;

public const DEFAULT =
self::Hearts;

public static function default(): static
{
return
self::DEFAULT;
}
}

var_dump(
Suit::cases(),
Suit::values(),
Suit::names(),
Suit::array(),
Suit::jsonSerialize(),
Suit::default(),
);
To Top