枚举是所有开发语言中必须的基础设施,不可理解的是php并没有在语言层次提供枚举特性。这导致很多所谓‘资深’php开发人员一直都不知道枚举这个东西的存在。更不用说使用枚举实现业务。没有枚举的系统是危险的、烂的、扯淡的,如果你对这个界定有不同意见,请关闭当前网页,继续自我陶醉。
这里提供一个底成本的枚举实现。依赖phpstorm的代码补全功能,其他ide支持不明。比如拿星期举例。
<?php
namespace App;
class Enum
{
const WEEK = [
'MONDAY'=>[
'v'=>1,
'name'=>'星期一',
'color'=>'yellow'
],
'TUESDAY'=>[
'v'=>1,
'name'=>'星期二',
'color'=>'red'
],
//略...
];
/**
* 翻译枚举name值
* @param $enum
* @param $value
* @return string
*/
public static function getName($enum, $value){
return static::getField($enum,$value,'name');
}
/**
* 获取枚举项字段
* @param $enum
* @param $value
* @param $field
* @return string
*/
public static function getField($enum,$value,$field){
$item = static::getItem($enum,$value);
if(!$item){
return '错误值:' . $value;
}
return $item[$field];
}
/**
* 根据指定字段的指定值返回枚举项
* @param $enum
* @param $field
* @param $value
* @return array
*/
public static function getItemByField($enum,$field,$value){
$r = [];
foreach ($enum as $item){
if($item[$field] === $value){
$r[] = $item;
}
}
return $r;
}
/**
* 获取枚举项
* @param $enum
* @param $value
* @param string $field
* @return string
*/
public static function getItem($enum,$value,$field = 'v'){
foreach ($enum as $item){
if($item[$field] == $value)
return $item;
}
return null;
}
}
以上代码实现了一周天数的枚举,并且提供了基础的枚举方法, 在phpstorm中可以使用代码提示方便访问枚举值进行逻辑判断等操作。
这是使用php数组以及phpstorm的代码提示功能实现的简单枚举实现,当然有其他方式实现更加强大的枚举,一般的系统使用这种方式完全可以满足需求。
热门评论