PHP学习笔记15:枚举
图源:php.net
从php 8.0.0开始,php支持枚举类型。简单地说,枚举代表一类有限的数据集,这在计算机领域非常常见,比如说用户类型(管理员,普通用户,VIP等),再比如订单类型(团队订单,个人订单等)。
在以前php不支持枚举的时候,我通常会使用类常量:
<?php
class UserType
{
const ADMINI = 0; //管理员
const NORMAL = 1; //普通用户
const VIP = 2; //vip
}
function create_user(string $name, int $type)
{
echo "create new user, name:{
$name}, type:{
$type}" . PHP_EOL;
}
create_user("admin", UserType::ADMINI);
create_user("test", 5);
// create new user, name:admin, type:0
// create new user, name:test, type:5
虽然这么做很方便,但是其实是有隐患的。原因是定义在类中的常量本身并不是一个真正的“封闭类型”,也就是说create_user
函数的$type
参数只能定义为int
,这就给非法传入参数提供了可能。当然我们可以添加额外的检测代码,但那样很麻烦,也不利于代码扩展。
最佳的解决方式就是引入真正的枚举:
<?php
namespace xyz\icexmoon\php_notes\ch15;
enum UserType
{
case ADMIN; //管理员
case NORMAL; //普通用户
case VIP; //vip
}
function create_user(string $name, UserType $type)
{
echo "create new user, name:{
$name}, type:{
$type->name}" . PHP_EOL;
}
create_user("admin", UserType::ADMIN);
// create new user, name:admin, type:ADMIN
create_user("test", 5);
// PHP Fatal error: Uncaught TypeError: xyz\icexmoon\php_notes\ch15\create_user():
在编译期就检查出了类型错误。
下面来详细介绍枚举类型。
枚举类型分为两种:纯枚举和回退枚举。
纯枚举
纯枚举就是我们上边展示过的普通形式的枚举,使用enum
关键字和case
就可以简单创建。
普通枚举是利用类来创建的,其中每一个case
定义的枚举值都是枚举类型的单例。作为单例,我们可以使用===
来比较是否为同一个枚举值:
<?php
namespace xyz\icexmoon\php_notes\ch15;
enum UserType
{
case ADMIN; //管理员
case NORMAL; //普通用户
case VIP; //vip
}
$ut_admin1 = UserType::ADMIN;
$ut_admin2 = UserType::ADMIN;
var_dump($ut_admin1 === $ut_admin2);
// bool(true)
var_dump($ut_admin1 === UserType::VIP);
// bool(false)
而===
和!==
以外的比较都是没有意义的:
var_dump($ut_admin1 > $ut_admin2);
// bool(false)
var_dump($ut_admin1 < UserType::VIP);
// bool(false)
枚举值有一个只读属性name
,可以用于打印枚举值的名称:
echo $ut_admin1