Masayan tech blog.

  1. ブログ記事一覧>
  2. Enum型クラスのメリットと、PHPでEnum型のクラスを自作する際の一例

Enum型クラスのメリットと、PHPでEnum型のクラスを自作する際の一例

公開日

環境

  • 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);
    }
}

動作

  1. Enum型のStockTypeクラスからstaticメソッドを呼びだす
  2. StockTypeクラス自身をnewして引数にself::GROCERY(つまり"食料品")が渡される
  3. 最後に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型のクラスを自作する際の一例について紹介しています。通常の定数で扱うよりも、予期しない値の代入を防止できたり、数値に名前が付くことでの可読性の向上が見込めたりと、メリットが結構ありますので、ぜひ参考にしてみてください。