ホームページ  >  記事  >  バックエンド開発  >  PHP8.1 の新機能の説明 Enums 列挙

PHP8.1 の新機能の説明 Enums 列挙

藏色散人
藏色散人オリジナル
2021-11-10 15:09:314906ブラウズ

この記事は翻訳です。元のアドレス: https://stitcher.io/blog/php-enums

PHP 8.1: Enumerations

ついに登場しました - 列挙型の組み込みサポートが PHP 8.1 で追加される予定です。ずっと前にそうすべきだったと思う人もいるかもしれませんが、あなたは私の苦情を聞いてくれませんでした。彼らがそうしてくれて良かったと思います。この記事では、新しく追加された機能について詳しく説明します。

私の PHP 特集投稿ではいつものように、列挙型がどのようなものであるかについての概要から始めます:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

列挙型の利点は、列挙型が一連の定数値を表すことですが、最も重要なことは、これらの値が次のように入力できることです:

class BlogPost
{
    public function __construct(
        public Status $status, 
    ) {}
}

この例では、列挙型を作成して aBlogPost に渡すのは次のようになります:

$post = new BlogPost(Status::DRAFT);

これが基本です。ご覧のとおり、それらはまったく複雑ではありません。補足事項はたくさんありますが、列挙について詳しく見てみましょう。

#列挙メソッド

列挙では、クラスと同様にメソッドを定義できます。これは、特に match 演算子と組み合わせた場合に非常に強力な機能です:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT => 'grey',   
            Status::PUBLISHED => 'green',   
            Status::ARCHIVED => 'red',   
        };
    }
}

メソッドは次のように使用できます:

$status = Status::ARCHIVED;
$status->color(); // 'red'

静的メソッドも使用できます:

enum Status
{
    // …
    
    public static function make(): Status
    {
        // …
    }
}

You列挙型で self を使用することもできます:

enum Status
{
    // …
    
    public function color(): string
    {
        return match($this) 
        {
            self::DRAFT => 'grey',   
            self::PUBLISHED => 'green',   
            self::ARCHIVED => 'red',   
        };
    }
}

#列挙型インターフェイス

列挙型は、通常のクラスと同様にインターフェイスを実装できます:

interface HasColor
{
    public function color(): string;
}
enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string { /* … */ }
}

# 列挙値 - 別名「バックド列挙」

列挙値は内部的にオブジェクトによって表されますが、必要に応じて値を割り当てることができます。これは、たとえば機能する場合に便利です。それらをデータベースにシリアル化します。

enum Status: string
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}

列挙定義内の型宣言に注意してください。すべての列挙値が指定された型に属していることを示します。 int にすることもできます。列挙値として許可されるのは int と string だけであることに注意してください。

enum Status: int
{
    case DRAFT = 1;
    case PUBLISHED = 2;
    case ARCHIVED = 3;
}

型列挙型の専門用語は、より単純な値によって「裏付けられる」ため、「裏付け列挙型」と呼ばれます。列挙値を割り当てる場合は、すべてのケースに値が必要です。これらを組み合わせて使用​​することはできません。 「裏付け」のない列挙は「純粋な列挙」と呼ばれます。

#インターフェイスでサポートされる列挙型

サポートされる列挙型をインターフェイスで使用する場合、列挙型は列挙名の直後に指定し、キーワードの前に実装する必要があります。

enum Status: string implements HasColor
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
    
    // …
}

#シリアル化でサポートされる列挙型

列挙型ケースに値を割り当てる場合は、それらをシリアル化および逆シリアル化する方法が必要になる場合があります。シリアル化するということは、列挙値にアクセスする方法が必要になることを意味します。これは、読み取り専用のパブリック プロパティを介して行われます:

$value = Status::PUBLISHED->value; // 2

列挙は、次を使用して値から復元できます: Enum::from

$status = Status::from(2); // Status::PUBLISHED

不明な値が渡された場合、tryFrom もあります。 null を返します。 from を使用する場合は例外があります。

$status = Status::from('unknown'); // ValueError
$status = Status::tryFrom('unknown'); // null

列挙型に対して組み込みのシリアライズ関数とアンシリアライズ関数を使用することもできることに注意してください。さらに、サポートされている列挙型で json_encode を使用することができ、結果は列挙値になります。この動作は、JsonSerializable を実装することでオーバーライドできます。

#列挙値のリスト

静的メソッド Enum::cases()

Status::cases();
/* [
    Status::DRAFT, 
    Status::PUBLISHED, 
    Status::ARCHIVED
] */
# を使用して、列挙で使用可能なすべてのケースのリストを取得できます。 ##この配列には実際の列挙オブジェクトが含まれていることに注意してください:

array_map(
    fn(Status $status) => $status->color(), 
    Status::cases()
);

#列挙はオブジェクトです

列挙値は実際のオブジェクトとして表されることはすでに述べました。上にはシングルトン オブジェクトがあります。これは、次のように比較できることを意味します。

$statusA = Status::PENDING;
$statusB = Status::PENDING;
$statusC = Status::ARCHIVED;
$statusA === $statusB; // true
$statusA === $statusC; // false
$statusC instanceof Status; // true

# Enums as Array Keys

enum 値は実際にはオブジェクトであるため、現時点ではそれらを比較する方法はありません。配列キーとして使用されます。次の場合はエラーが発生します:

$list = [
    Status::DRAFT => 'draft',
    // …
];

この動作を変更する RFC がありますが、まだ投票されていません。

これは、SplObjectStorage と WeakMaps では列挙型のみをキーとして使用できることを意味します。

#Traits

列挙型ではクラスと同様に特性を使用できますが、さらに制限があります。組み込み列挙メソッドのオーバーライドは許可されておらず、クラス属性を含めることはできません。列挙での使用は禁止されています。

#Reflection とプロパティ

予想どおり、列挙を処理するためにいくつかのリフレクション クラス (ReflectionEnum、ReflectionEnumUnitCase、および ReflectionEnumBackedCase) が追加されました。新しい enum_exists 関数もあり、その名前が示すとおりの動作をします。

通常のクラスや属性と同様に、列挙型とそのケースには属性を使用して注釈を付けることができます。 TARGET_CLASS フィルターには列挙も含まれることに注意してください。

最後にもう 1 つ: 列挙型には読み取り専用属性もあります。RFC では、これは実装の詳細であり、デバッグ目的でのみ使用する必要があると述べられています。しかし、それでも言及する価値はあります。

$列挙型->名前

以上がPHP8.1 の新機能の説明 Enums 列挙の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。