0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP8.1 Enums 導入

Posted at

PHP8.1のEnum導入方法を学習の為、アウトプットします

導入の経緯

今までプロジェクトではBenSampo/laravel-enumを使用してましたが、PHP8.1でEnumsが実装され、BenSampo/laravel-enumのリポジトリで

「Using this library is no longer recommended, especially for new projects. PHP 8.1 supports enums natively.」
このライブラリの使用は、特に新しいプロジェクトでは推奨されなくなりました。PHP 8.1 は enum をネイティブにサポートします。

と書かれていた為、PHP8.1のEnumsを導入することにしました

導入方法

enum と宣言して列挙型を宣言する
case を使って列挙する

Fruit.php
<?php 

declare(strict_types=1);

enum SportsType: string
{
    case APPLE = 'apple';
    case ORANGE = 'orange';
    case LEMON = 'lemon';

    /**
     * @return string
     */
    public function description(): string
    {
        return match($this) {
            self::APPLE => '林檎',
            self::ORANGE => '蜜柑',
            self::LEMON => '檸檬',
        };
    }
}

enums.phpを使用して日本語定義を行う方法

BenSampo/laravel-enumを使用していた時はlang/ja/enums.phpで日本語定義をしてました。
PHP8.1のEnumで日本語定義を行うために、今回はTrait/EnumDescription.phpを作成しました。

EnumDescription.php
<?php

declare(strict_types=1);

trait EnumDescription
{
    public function description(): string
    {
        return __(sprintf('enums.%s.%s', self::class, $this->name));
    }
}
  • __(...): Laravelの翻訳関数です。ここでは、言語ファイルから文字列を取得するために使われます。
  • self::class: 呼び出されたEnumのクラス名(例: Enums/Fruit.php
  • $this->name: Enumのケース名(例: APPLEORANGE)。
  • sprintf('enums.%s.%s', self::class, $this->name) で、'enums.Enums/Fruit.php.APPLE' のようなキーを作成し、それに基づいて翻訳を取得します。
Fruit.php
<?php 

use App\Trait\EnumDescription;

enum Fruit: string
{
    use EnumDescription;
    
    case APPLE = 'apple';
    case ORANGE = 'orange';
    case LEMON = 'lemon';
}
enums.php
<?php

return [
    Enums\Fruit::class => [
        'APPLE' => '林檎',
        'ORANGE' => '蜜柑',
        'LEMON' => '檸檬',
    ],
];

使い方

Fruit::APPLE->description()で呼び出すと、林檎が出力されます。
Modelでcastをすると、$this->fruit->description()でも保存されている値に紐づく日本語が表示されます。

まとめ

今回はEnumの記事を書きました。
EnumについてはPHP8.1から追加されているのをキャッチアップできておらず、知識の定着も兼ねてアウトプットすることにしました。
まだまだPHPにしても、Laravelにしても最新バージョンの機能を把握しきれていないので少なくとも自分が使う機能については把握したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?