php8.1新增了枚举类,在php8.1之前,我们可以使用第三方包,https://packagist.org/packages/myclabs/php-enum,安装
composer require myclabs/php-enum
PHP8.1之前
枚举类可以比一般的常量标识更加清晰,也能做好参数限定,提升代码的健壮性。
下面是定义了一个枚举类,我们来看下怎么使用它?
<?php
use MyCLabs\Enum\Enum;
require __DIR__ . '/vendor/autoload.php';
final class Status extends Enum
{
const SHOW = 0;
const HIDE = 1;
//定义一个转换函数,用来显示
public function label(): string
{
return match($this->getValue()) {
self::SHOW => '显示',
self::HIDE => '隐藏',
};
}
}
枚举类可以在参数上做限定,在数据库中查询出来的状态可以转换成对应的枚举对象,一旦没有对应的值,就会抛异常,比纯粹的数字或者字符标识更好。
print_r(Status::values());
//使用枚举类,做参数限定
function test(Status $status)
{
var_dump($status);
}
//这样调用的时候,就不用怕传递错误的值了
$status = Status::SHOW();
test($status);
//这种调用会报错
// test(0);
//输出所有的状态对象和描述
foreach(Status::values() as $item){
var_dump($item->getValue(),$item->label());
}
//枚举值常跟数据库的状态字段相对应,一般我们从数据库取出来的时候,都是简单的数据类型,int|string
//找不到该值会抛异常
try {
$status=new Status(1);
var_dump($status);
} catch (\Throwable $e) {
echo $e->getMessage()."\n";
}
//枚举对象比较
$a=new Status(0);
$b=new Status(0);
var_dump($a==$b); //这里只能是两个等于号 ==
var_dump($a->equals($b));
PHP8.1之后
php提供了内置的枚举类,我们可以直接使用,下面我们先定义一个枚举类:
//定义一个枚举类
enum Status:int
{
case Show = 0;
case Hide = 1;
//定义一个转换函数,用来显示
public function label(): string
{
return match($this) {
static::Show => '显示',
static::Hide => '隐藏',
};
}
}
常见的使用方式:
//输出所有的枚举对象
print_r(Status::cases());
//参数限定
function test(Status $status){
var_dump($status);
}
//函数调用的时候,只能传枚举对象,不能传值
test(Status::Show);
//报错
// test(0);
// 可以用来显示在前端html上
foreach (Status::cases() as $case) {
var_dump($case->value,$case->label());
}
//枚举值常跟数据库的状态字段相对应,一般我们从数据库取出来的时候,都是简单的数据类型,
//可以通过form、或者tryform方法进行转换
//找不到该值会抛异常
try {
$status=Status::from(2);
var_dump($status);
} catch (\Throwable $e) {
echo $e->getMessage()."\n";
}
//找不到该值会返回null
$status=Status::tryfrom(2);
var_dump($status);
//枚举对象比较
$a=Status::from(0);
$b=Status::from(0);
var_dump($a===$b);
日常的开发中,但我们需要定义一系列的常量,例如订单状态值、业务的流程状态,都可以用枚举类实现。