ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #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 => 'Π’ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ',
self::Active => 'Активный',
self::Suspended => 'ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ',
self::CanceledByUser => 'ΠžΡ‚ΠΌΠ΅Π½Ρ‘Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ',
};
}
}

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

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ статус ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ограничиваСтся СдинствСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²: UserStatus::Pending, UserStatus::Active, UserStatus::Suspended ΠΈΠ»ΠΈ UserStatus::CanceledByUser. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² сигнатурС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с Ρ‚ΠΈΠΏΠΎΠΌ UserStatus Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ значСния, Ρ‚ΠΎΡ‡ΠΊΠ°.

ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ доступСн ΠΌΠ΅Ρ‚ΠΎΠ΄ label(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ для чтСния Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. Π­Ρ‚Π° строка Π½Π΅ зависит ΠΎΡ‚ строки со скалярным эквивалСнтом «машинного ΠΈΠΌΠ΅Π½ΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, хранят Π² ΠΏΠΎΠ»Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ выводят ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка Π² HTML-Ρ„ΠΎΡ€ΠΌΠ΅.

<?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 => 'Π’ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ',
self::Active => 'Активный',
self::Suspended => 'ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ',
self::CanceledByUser => 'ΠžΡ‚ΠΌΠ΅Π½Ρ‘Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ',
};
}
}

foreach (
UserStatus::cases() as $case) {
printf(
"<option value=\"%s\">%s</option>\n",
htmlentities($case->value),
htmlentities($case->label())
);
}
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 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(),
);