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?

More than 1 year has passed since last update.

PHP7.4でEnumライクなものを実装してみた

Last updated at Posted at 2022-06-13
../

PHPでもJavaのEnumのようなものを使いたい。最新のPHPでは提供されているようだが、PHP7.4にはなかったのでそれっぽいものを作ってみた。とりあえず、整数の$ordinalに対応する文字列を返す関数value(int $ordinal):stringが提供できていればいいだろう。

Enum.php
<?php
namespace common;

abstract class Enum {
  
  protected static function key(int $ordinal): string {
    return '_' . $ordinal;
  }
  
  abstract static function __initialize();
  abstract static function value(int $ordinal): string;
}

このEnumを継承して、それぞれ定義する。例として、アクセス権限(AclRole)を書いてみる。

AclRole.php
<?php
namespace users\domain;
require_once(__DIR__."/../../common/Enum.php");
use common\Enum;

class AclRole extends Enum {
  
  const ACL_USER = 1;
  const ACL_ADMIN = 2;
  
  private static $enums;
  
  public static function __initialize() {
    if (!empty(self::$enums)) return;
    self::$enums = [
        parent::key(self::ACL_USER) => '利用者',
        parent::key(self::ACL_ADMIN) => '管理者'
    ];
  }
 
  public static function value(int $ordinal): string {
    $k = parent::key($ordinal);
    return isset(self::$enums[$k]) ? self::$enums[$k] : '';
  }
}

AclRole::__initialize();

利用方法は、以下の感じ。あらかじめ定義した整数値から対応する文字列を取るだけである。

$r1 = AclRole::ACL_USER;
$r2 = AclRole::ACL_ADMIN;
$r3 = 3;
echo AclRole::value($r1).PHP_EOL; 	// '利用者'
echo AclRole::value($r2).PHP_EOL; 	// '管理者'
echo AclRole::value($r3).PHP_EOL; 	// ''

単に配列のインデックスだと0,1,2,...のように固定されてしまうので、それは避けたかった。もっといい書き方があるとは思うが、当面はこの程度で使ってみたい。

../
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?