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

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

Nov 10, 2021 pm 03:09 PM
php8

この記事は翻訳です。元のアドレス: 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php5とphp8の違いは何ですか php5とphp8の違いは何ですか Sep 25, 2023 pm 01:34 PM

php5 と php8 の違いは、パフォーマンス、言語構造、型システム、エラー処理、非同期プログラミング、標準ライブラリ関数、セキュリティの点です。詳細な紹介: 1. パフォーマンスの向上. PHP5 と比較して、PHP8 はパフォーマンスが大幅に向上しています. PHP8 では、高頻度の実行コードをコンパイルおよび最適化できる JIT コンパイラーが導入されており、それによって実行速度が向上しています; 2. 言語構造の改善、 PHP8 では、いくつかの新しい言語構造と関数が導入されており、PHP8 では名前付きパラメータがサポートされており、開発者はパラメータの順序などの代わりにパラメータ名を渡すことができます。

mysql拡張機能をphp8に追加する方法 mysql拡張機能をphp8に追加する方法 Oct 07, 2023 pm 03:31 PM

mysql 拡張機能を php8 に追加する手順は次のとおりです: 1. MySQL クライアント ライブラリをインストールします; 2. PHP 8 の開発ツールをインストールします; 3. MySQL 拡張機能のソース コードをダウンロードします; 4. MySQL 拡張機能をコンパイルしてインストールします; 5. MySQL 拡張機能; 6. Web サーバーのみを再起動します。

apache2.4+php8.0のインストールと設定方法を図解で詳しく解説 apache2.4+php8.0のインストールと設定方法を図解で詳しく解説 Dec 06, 2022 pm 04:53 PM

この記事では、apache2.4のインストール方法とphp8.0の設定方法を画像付きで詳しく紹介します。apache2.4+php8.0のインストールと設定方法を見てみましょう~

php8でデータベースに接続する方法 php8でデータベースに接続する方法 Nov 16, 2023 pm 02:41 PM

PHP8 は、mysqli と PDO を使用してデータベースに接続できます。詳細な紹介: 1. mysqli を使用して、データベース サーバー名、ユーザー名、パスワード、および接続するデータベース名を渡してデータベースに接続します。次に、`connect_error` 属性を使用して接続が成功したかどうかを確認し、接続が失敗した場合はエラー メッセージを出力します。最後に、`close()` メソッドを呼び出して接続を閉じます; 2. PDO を使用してデータベースに接続し、データベース サーバー名、パスワード、データベース名などを渡して接続します。

php8のデータ型を変換する方法 php8のデータ型を変換する方法 Nov 16, 2023 pm 02:51 PM

php8 データ型のメソッドには、文字列から整数への変換、整数から文字列への変換、文字列から浮動小数点数への変換、浮動小数点数から文字列への変換、配列から文字列への変換、文字列から配列への変換、およびブール値から整数への変換が含まれます。 . 整数からブール値への変換、変数の型の決定と変換。詳細な紹介: 1. 文字列から整数への変換には、intval() 関数と (int) 強制型変換が含まれます; 2. 整数から文字列への変換には、strval() 関数と (string) 強制型変換が含まれます; 3. 変換文字列を浮動小数点ポイントに変換するなどです。

PHP 8 の JIT の詳細 PHP 8 の JIT の詳細 Apr 25, 2022 pm 08:46 PM

この記事では、PHP 8 の JIT について説明し、JIT が解釈プロセスにどのように参加するかについて説明します。

php8 ではどのようなパフォーマンスの向上がありますか? php8 ではどのようなパフォーマンスの向上がありますか? Dec 21, 2023 pm 02:44 PM

php8 のパフォーマンス向上には、1. JIT コンパイラの導入、2. 関数呼び出しの最適化、3. ガベージ コレクション メカニズムの改善、4. 型システムの改善、5. 新しい言語機能、6. 文字列処理の最適化、7.配列処理の改善、8. 新しいメモリ管理メカニズムの導入、9. コード生成の最適化。詳細な紹介: 1. JIT コンパイラーの導入 PHP8 では、より効率的に実行するために PHP コードをマシンコードに変換できる動的コンパイル技術である JIT コンパイラーが導入されています; 2. 関数呼び出しの最適化など。

php8にはどのような機能があるのでしょうか? php8にはどのような機能があるのでしょうか? Dec 21, 2023 pm 02:54 PM

php8 の機能: 1. JIT コンパイラ; 2. 名前付きパラメータ; 3. 共用体型; 4. アノテーション; 5. コンストラクタ属性の強化; 6. 一致式; 7. nullsafe 演算子; 8. 型システムの改善; 9 、エラー処理の改善; 10. 一貫性の向上。詳細な紹介: 1. JIT コンパイラ、PHP8 は、PHP コードをネイティブ マシン コードにコンパイルするジャストインタイム コンパイル テクノロジを導入し、それによってプログラムの実行速度を向上させます; 2. 名前付きパラメータ、PHP8 は名前付きパラメータをサポートし、関数呼び出し時のパラメータ名など

See all articles