概述迭代了N个版本,终于在最新版本中实现了与Java枚举定义非常相似的PHP枚举库php-enum。这里有必要提一下为什么要实现Java的枚举功能。我知道Java中的枚举。在此之前,我长期使用PHP,没有听说过枚举,但是在Java项目中,枚举随处可见,尤其是在返回统一状态码的API中。在场景中,它几乎已经成为一种标准,所以我没有办法忽视它,所以我也学会了使用它。再次使用PHP的时候,发现不习惯没有枚举,所以感觉在PHP中搜索枚举,在PHP中使用枚举有两种选择,一种是SPL中官方提供的枚举库,看到这里是不是特别开心?别着急,看完文档你会发现不仅要用扩展方式安装,而且它提供的方法也很有限。所以通常我们会选择第二种方式,也就是使用第三方的枚举库。而且通过阅读第三方枚举的源码,你也会发现它们或多或少都有Java枚举的影子。但是如果他们实现Java枚举的功能,就不会有今天的库和文章。查了很多枚举,发现都缺少Java枚举中的核心功能,即自定义属性值(在Java枚举中,枚举并不是简单的定义常量名和常量值,你可以在中给元素定义属性枚举),发现在php中实现这个功能并不容易,于是在项目中写了一个抽象类来实现固定两个属性的功能,因为需要在多个项目中使用,所以放在了github,经过多次重构,一次又一次推翻自己的想法,终于接近Java枚举的实现Installcomposerrequirephpenum/phpenumQuickstartPHPEnum和Java枚举很相似,比如在Java中定义一个表示性别的枚举:publicenumGenderEnum{MALE(1,"男"),FEMALE(2,"女");私有整数id;私有字符串名称;GenderEnum(Integerid,Stringname){this.id=id;this.name=名称;}publicIntegergetId(){返回id;}publicStringgetName(){返回名称;}}使用PhpEnum:classGenderEnumextends\PhpEnum\Enum{constMALE=[1,'male'];constFEMALE=[2,'女性'];私人$id;私人的名字;protectedfunctionconstruct($id,$name){$this->id=$id;}$this->名字->$名字;}publicfunctiongetId(){return$this->id;}公共函数getName(){返回$t他的->名字;你会发现它们在Java中的用法非常相似:GenderEnum.values();//枚举实例arrayGenderEnum.valueOf("FEMALE");//枚举instanceGenderEnum.MALE.equals(GenderEnum.valueOf("MALE"));//trueGenderEnum.MALE.name();//MALEGenderEnum.MALE.ordinal();//0GenderEnum.MALE.toString();//MALEGenderEnum.MALE.getId();//1GenderEnum.MALE.getName();//男性使用PhpEnum:GenderEnum::values();//枚举实例arrayGenderEnum::valueOf('FEMALE');//枚举instanceGenderEnum::MALE()->equals(GenderEnum::valueOf('MALE'));//trueGenderEnum::MALE()->name();//MALEGenderEnum::MALE()->ordinal();//0(字符串)性别枚举::男性();//MALEGenderEnum::MALE()->getId();//1GenderEnum::MALE()->getName();//male不仅如此,PhpEnum还在子类GenderEnum::MALE()->idEquals(1)中提供了高级函数;//trueGenderEnum::MALE()->NameEquals('男性');//trueGenderEnum::containsId(1);//1GenderEnum::containsName('男性');//1性别枚举::ofId(1);//枚举instanceGenderEnum::ofName('male');//枚举一个实例
