Loading... # [PHP 枚举:是时候告别老式类常量了](https://mp.weixin.qq.com/s/yFEVY6eZ79InnHzIksKESA) 枚举在 PHP 中已经引入两年了,如果您还在使用类常量来表示枚举值,那么是时候切换到 PHP 枚举了。以下是四个令人信服的理由。 ## 1、内置“cases”方法 想象一下,您正在开发一个具有不同用户状态的项目。有些是活跃的,有些是禁止的,还有一些尚未完成注册。以老式的方式,您可以使用类常量处理这些状态,从而产生如下代码: ![lqz76ak2.png](http://flt-pan.58heshihu.com/blog/typecho/lqz76ak2.png) all方法之所以存在,是因为它满足了一个非常常见的需求:在下拉菜单中显示所有可能的选项。您可以通过创建自己的方法或使用反射来实现这一点。 现在,让我们看看枚举如何简化这一过程: ![lqz76jcm.png](http://flt-pan.58heshihu.com/blog/typecho/lqz76jcm.png) 使用枚举,您可以使用内置的“cases”方法,它会自动返回所有可用选项的数组。告别每次添加新状态时手动更新常用选项列表。 ![lqz76oze.png](http://flt-pan.58heshihu.com/blog/typecho/lqz76oze.png) ## 2、类型提示 回到用户状态的示例,让我们考虑一种情况,我们有一种设置用户状态的方法。我们希望只将有效状态存储在数据库中。它通常是这样的: ![lqz76tc3.png](http://flt-pan.58heshihu.com/blog/typecho/lqz76tc3.png) 看起来有点难看。我们有更好的解决方案! ![lqz76zxm.png](http://flt-pan.58heshihu.com/blog/typecho/lqz76zxm.png) 通过类型提示,我们可以确保只有来自 UserStatus 枚举的有效状态值才能传递给方法参数。这可以消除潜在的错误,例如使用无效状态值引起的问题。 ## 3、枚举方法 我将继续使用带有用户状态的示例。假设有些人可以登录系统,有些人则不能。 老式的方式: ![lqz7755w.png](http://flt-pan.58heshihu.com/blog/typecho/lqz7755w.png) 使用枚举: ![lqz779u1.png](http://flt-pan.58heshihu.com/blog/typecho/lqz779u1.png) 虽然它不是“游戏规则改变者”,但它确实可以使代码更简洁、更紧凑。 ## 4、独特性 这个与本主文的第二点略有重叠,但我想单独强调一下。 想象一下,我们不仅有用户的状态,还有我们在线商店中商品的状态。 ![lqz77mzs.png](http://flt-pan.58heshihu.com/blog/typecho/lqz77mzs.png) 让我们从前面的示例中获取一段代码,并以不当的方式使用它。 ![lqz77wyr.png](http://flt-pan.58heshihu.com/blog/typecho/lqz77wyr.png) 虽然我们不会收到错误,但这可能是一个潜在的问题。如果将来我们更改 ProductStatus::ACTIVE 常量的值,我们可能会在这里收到错误。 那么枚举呢?枚举是唯一的。 ![lqz781h4.png](http://flt-pan.58heshihu.com/blog/typecho/lqz781h4.png) 即使 UserStatus::ACTIVE 和 ProductStatus::ACTIVE 具有相同的值,它也是不同的项目。我们可以轻松地手动检查。 ![lqz787bv.png](http://flt-pan.58heshihu.com/blog/typecho/lqz787bv.png) 这意味着类型提示对我们有双重帮助——它不允许使用不正确的值,也不允许使用这些值的不正确来源,即使它们看起来合适。 最后修改:2024 年 01 月 04 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏