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 を使って列挙する
<?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を作成しました。
<?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のケース名(例:APPLE
やORANGE
)。 -
sprintf('enums.%s.%s', self::class, $this->name)
で、'enums.Enums/Fruit.php.APPLE'
のようなキーを作成し、それに基づいて翻訳を取得します。
<?php
use App\Trait\EnumDescription;
enum Fruit: string
{
use EnumDescription;
case APPLE = 'apple';
case ORANGE = 'orange';
case LEMON = 'lemon';
}
<?php
return [
Enums\Fruit::class => [
'APPLE' => '林檎',
'ORANGE' => '蜜柑',
'LEMON' => '檸檬',
],
];
使い方
Fruit::APPLE->description()で呼び出すと、林檎が出力されます。
Modelでcastをすると、$this->fruit->description()でも保存されている値に紐づく日本語が表示されます。
まとめ
今回はEnumの記事を書きました。
EnumについてはPHP8.1から追加されているのをキャッチアップできておらず、知識の定着も兼ねてアウトプットすることにしました。
まだまだPHPにしても、Laravelにしても最新バージョンの機能を把握しきれていないので少なくとも自分が使う機能については把握したいと思います。