例

例1 åŸēæœŦįš„ãĒ、値を限厚する䞋

<?php
enum SortOrder
{
case
Asc;
case
Desc;
}

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

query() é–ĸ数は、 $order が SortOrder::Asc ぞたは 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',
};
}
}

$status = UserStatus::Suspended;
var_dump($status->label());

こぎ䞋では、ãƒĻãƒŧã‚ļãƒŧぎ゚テãƒŧã‚ŋ゚は UserStatus::Pending、 UserStatus::Active、 UserStatus::Suspended ぞたは UserStatus::CanceledByUser ãŽã†ãĄãŽã˛ã¨ã¤ãĢ限られãĻいぞす。 é–ĸæ•°ã¯ãƒ‘ãƒŠãƒĄãƒŧã‚ŋぎ型を UserStatus ãĢ指厚できぞすし、これら4つぎ値だけを受けå…Ĩれぞす。

これら4つぎ値は、それぞれ label() ãƒĄã‚Ŋãƒƒãƒ‰ã‚’æŒãĄãžã™ã€‚ これは、äēē間がčĒ­ãŋやすい文字列をčŋ”しぞす。 こぎ文字列は、"ãƒžã‚ˇãƒŗä¸ŠãŽ" ゚ã‚Ģナãƒŧ値とはåˆĨぎもぎです。 こぎ゚ã‚Ģナãƒŧ値は、デãƒŧã‚ŋベãƒŧã‚šãŽãƒ•ã‚ŖãƒŧãƒĢドや、 HTML ぎ select ボック゚でäŊŋうことができぞす。

<?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',
};
}
}

foreach (
UserStatus::cases() as $case) {
printf(
"<option value=\"%s\">%s</option>\n",
htmlentities($case->value),
htmlentities($case->label())
);
}
īŧ‹add a note

User Contributed Notes 1 note

up
20
php-net at mentordosnerds dot com Âļ
2 years 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(),
);