PHP之枚举

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);

日常的开发中,但我们需要定义一系列的常量,例如订单状态值、业务的流程状态,都可以用枚举类实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值