環境
- windows10
- DockerDesktop for Win 3.5.x
- Laravel 8.x
- PHP 8.x
- VsCode
- gitbash 2.32.0.1
Enumとは
- 列挙型のこと
- 複数の定数を一つのクラスとしてまとめておくことができる型
- 予期しない値の代入を防止できる
- 数値に名前が付くことでの可読性の向上
- switch文との相性がよい
- PHPはJavaと違ってEnum型というデータ型がないため、現状は自作する必要がある(Javaでは、enumはクラスのように扱えますが、インスタンス化不可)
- PHP8.1でEnum用のクラスが作成できる?ようになるらしい...
Enum例
一例をご紹介します。
もとになるEnumクラス
Enum.php
<?php
namespace Stocker\Domain\Shared;
class Enum
{
protected mixed $value;
protected function __construct(mixed $value)
{
$this->value = $value;
}
public function value(): mixed
{
return $this->value;
}
}
実際に作成したいEnum型のクラス
在庫の種類をEnum型のクラスで管理したいとします。
ポイントは以下です
- Enum型として作成したいクラスはEnumクラスを継承させて使用する
- コンストラクタはpublicにしない(使う側でnewするときに想定していない値が渡されるのを防止)
- staticメソッドでnew selfしてそのEnum型のクラス自身を生成して返し、Enumクラスのvalueメソッドで実際の値を取得する
StockType.php
<?php
namespace Stocker\Domain\Stock\Enum;
use Stocker\Domain\Shared\Enum;
class StockType extends Enum
{
// 定数はint型のほうがよいかも。
private const GROCERY = '食料品';
private const KITCHENWARE = '台所用品';
private const ClEANING_SUPPLIES = '掃除用品';
private const OTHER = 'その他';
public static function grocery(): self
{
return new self(self::GROCERY);
}
public static function kitchenware(): self
{
return new self(self::KITCHENWARE);
}
public static function cleaningSupplies(): self
{
return new self(self::ClEANING_SUPPLIES);
}
public static function other(): self
{
return new self(self::OTHER);
}
}
動作
- Enum型のStockTypeクラスからstaticメソッドを呼びだす
- StockTypeクラス自身をnewして引数にself::GROCERY(つまり"食料品")が渡される
- 最後にEnumクラスからvalue()を呼び出して期待値("食料品")と等しいかアサ―ト
StockTypeTest.php
<?php
namespace Tests\Feature;
use PHPUnit\Framework\TestCase;
use Stocker\Domain\Stock\Enum\StockType;
class StockTypeTest extends TestCase
{
/**
* @test
*/
public function 在庫タイプを取得できる()
{
$stockType = StockType::grocery()->value();
$this->assertEquals('食料品', $stockType);
}
}
無事テスト通りました。
あとはEnumクラスに、各定数のvalueからkeyを取得する関数を追加して使いやすくする等ありますが、今回はここまでにしたいと思います。
まとめ
いかがでしたでしょうか。本記事では、Enum型クラスのメリットと、PHPでEnum型のクラスを自作する際の一例について紹介しています。通常の定数で扱うよりも、予期しない値の代入を防止できたり、数値に名前が付くことでの可読性の向上が見込めたりと、メリットが結構ありますので、ぜひ参考にしてみてください。