概述
在迭代了N个版本后,终于在目前最新的版本中实现了和Java枚举定义使用都非常相似的PHP枚举库php-enum
这里有必要提一下为什么非要实现Java枚举功能。我是在Java中认识枚举的,在此之前,我使用PHP很长时间也没有听说的过枚举,但在Java的项目中,枚举随处可见,尤其是在API返回统一状态码的场景中,它已经快成为了规范,所以我并没有办法忽略它,于是也学着使用它,等我再使用PHP的时候发现已经不太习惯没有枚举,于是感觉去搜索PHP的枚举
众所周知,在PHP中要使用枚举有两个选择,一个是官方在SPL中提供的枚举库,看到这里,是不是特别开心。别急,阅读文档后你会发现,你不仅要以拓展的方式安装它,它提供的方法也非常有限。所以通常我们会选择第二种方式,也就是使用第三方的枚举库。而通过阅读第三方的枚举的源码你也会发现,它们或多或少都有Java枚举的影子。但如果它们实现了Java枚举的功能也就不会有今天的库和文章了。
我查了很多枚举,发现它们都缺少Java枚举中的核心功能,也就是自定义属性值(在Java枚举中,枚举并不是简单的定义常量名称和常量值,你可以定义属性来承载枚举中的元素)同时也发现在php中实现这个功能并不容易,于是我在项目中写了个抽象类来实现固定两个属性的功能,因为要在多个项目中使用,就将它放到了github上,经过多次重构,一次次推翻自己的想法,最终终于接近了Java枚举的实现
安装
composer require phpenum/phpenum
快速开始
PHPEnum用起来和Java枚举很像,比如定义一个表示性别的枚举
在Java中:
public enum GenderEnum {
MALE(1, "male"),
FEMALE(2, "female");
private Integer id;
private String name;
GenderEnum(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
}
使用PhpEnum:
class GenderEnum extends \PhpEnum\Enum
{
const MALE = [1, 'male'];
const FEMALE = [2, 'female'];
private $id;
private $name;
protected function construct($id, $name)
{
$this->id = $id;
$this->name->$name;
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
}
你会发现它们的用法也非常相似
在Java中:
GenderEnum.values(); // enum instance array
GenderEnum.valueOf("FEMALE"); // enum instance
GenderEnum.MALE.equals(GenderEnum.valueOf("MALE")); // true
GenderEnum.MALE.name(); // MALE
GenderEnum.MALE.ordinal(); // 0
GenderEnum.MALE.toString(); // MALE
GenderEnum.MALE.getId(); // 1
GenderEnum.MALE.getName(); // male
使用PhpEnum:
GenderEnum::values(); // enum instance array
GenderEnum::valueOf('FEMALE'); // enum instance
GenderEnum::MALE()->equals(GenderEnum::valueOf('MALE')); // true
GenderEnum::MALE()->name(); // MALE
GenderEnum::MALE()->ordinal(); // 0
(string)GenderEnum::MALE(); // MALE
GenderEnum::MALE()->getId(); // 1
GenderEnum::MALE()->getName(); // male
不仅如此,PhpEnum还在子类中提供了高级功能
GenderEnum::MALE()->idEquals(1); // true
GenderEnum::MALE()->NameEquals('male'); // true
GenderEnum::containsId(1); // 1
GenderEnum::containsName('male'); // 1
GenderEnum::ofId(1); // enum instance
GenderEnum::ofName('male'); // enum instance
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。