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(),
);Примери
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Примери
Референца за `language.enumerations.examples.php` со подобрена типографија и навигација.
Примери
Пример #1 Основни ограничени вредности
<?php
enum SortOrder
{
case Asc;
case Desc;
}
function query($fields, $filter, SortOrder $order = SortOrder::Asc)
{
/* ... */
}
?>
На query() функцијата сега може да продолжи со сигурност знаејќи дека
$order е загарантирано да биде или SortOrder::Asc
or SortOrder::Desc. Секоја друга вредност би резултирала со
TypeError, така што не е потребно дополнително проверување на грешки или тестирање.
Пример #2 Напредни ексклузивни вредности
<?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',
};
}
}
?>
Во овој пример, статусот на корисникот може да биде еден од, и ексклузивно, UserStatus::Pending,
UserStatus::Active, UserStatus::Suspended, или
UserStatus::CanceledByUser. Функцијата може да напише параметар против
UserStatus и потоа да прифати само тие четири вредности, точка.
Сите четири вредности имаат label() метод, кој враќа човечки читлив стринг. Тој стринг е независен од скаларниот еквивалентен стринг „машинско име“, кој може да се користи во, на пример, поле за база на податоци или HTML поле за избор.
<?php
foreach (UserStatus::cases() as $case) {
printf('<option value="%s">%s</option>\n', $case->value, $case->label());
}
?>