../ |
---|
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,...のように固定されてしまうので、それは避けたかった。もっといい書き方があるとは思うが、当面はこの程度で使ってみたい。
../ |
---|