PHP 枚举开发教程:快速上手枚举类型应用技巧

admin 2024-05-10 997 阅读 0评论

让我们从最基础的概念入手。枚举(Enum)是一种独特的数据类型,它允许我们定义一组具有明确名称的常量集合。这些常量各自代表着变量可能取的一个特定值,因此,它们能够显著提升代码的可读性,并减少因误用变量值而导致的错误。

在此,我并不打算详细介绍如何创建枚举,因为我相信对于大部分读者来说,这个概念已经耳熟能详。

接口

在 PHP 中,枚举(Enumeration)与类(Class)的概念颇为相似,这使得创建枚举和使用接口(Interface)变得轻而易举。由于这种相似性,开发者在 PHP 中实现和使用枚举时,可以无缝地应用他们在类与接口方面的知识与经验,无需面临额外的挑战或学习曲线。

enum UserRole: string implements FilterInterface
{
   case ADMIN = 'admin';

   public function applyFilter(): void
   {
        // TODO:实现 applyFilter() 方法。
    }
}

特征

通过利用特征,您可以进一步丰富枚举的功能!

enum UserRole: string implements FilterInterface
{
   use FilterTrait;

   case ADMIN = 'admin';
}

属性

在 PHP 8.1 版本中,属性(Properties)的引入为 PHP 语言带来了革命性的变化,特别是当它们与枚举(Enumerations)结合使用时,极大地增强了 PHP 的功能性和灵活性。这种结合使得开发者能够以前所未有的方式定义和操作类中的数据,从而更加高效地构建出健壮、可扩展的 PHP 应用程序。

创建属性
#[Attribute]
class Config
{
   public function __construct(
       public string $displayName,
       public string $permission = ''
   )
   {}
}

我们将这一方法应用于我们的枚举常量,这仅仅是一个展示如何运用属性的实例。

enum UserRole: string implements FilterInterface
{
   use FilterTrait, GetsAttributes;

   #[Config(displayName: 'Administrator', permission: 'full_access')]
   case Admin = 'admin';
}

如果在项目中使用它呢?

元音规则

始终遵守基本规则:对所有枚举情况使用枚举。

// 不好的
class Types
{
    public const THEME = 'theme';
}

// 好的
enum Type: string
{
    case THEME = 'theme';
}

验证规则

在请求中使用验证规则以避免不必要的错误。

class CreateRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'type' => ['required', new Enum(TypeEnum::class)],
        ];
    }

    public function getType(): TypeEnum
    {
        return TypeEnum::from($this->validated('type'));
    }
}

枚举作为匹配机制中不可或缺的一环

我不会向您透露哪些可以与枚举结合使用的匹配功能,但就我个人而言,我倾向于在工厂方法中使用枚举。这种用法之所以特别实用,是因为您的代码编辑器能够轻松地指出哪些处理程序尚未实现的情况,从而大大简化了代码调试和错误排查的过程。这种便捷性让枚举在匹配机制中扮演了至关重要的角色。

return match ($type) {
    Type::INTRO => $this->container->make(IntroAssetContentGenerator::class),
    Type::TITLE => $this->container->make(TitleAssetContentGenerator::class),
    Type::TESTIMONIAL => $this->container->make(TestimonialsAssetContentGenerator::class),
    Type::FEATURES => $this->container->make(FeaturesAssetContentGenerator::class),
    Type::CARDS => $this->container->make(CardsAssetContentGenerator::class),
    Type::DYNAMIC_CONTENT => $this->container->make(DynamicContentAssetContentGenerator::class),
    Type::CAROUSEL => $this->container->make(CarouselAssetContentGenerator::class),
    Type::MEDIA => $this->container->make(MediaAssetContentGenerator::class),
};

使用 Enum 作为数据类型

将枚举数据常量不是作为字符串传递,而是作为 Enum 传递,这将提高代码可读性并减少错误数量。

public function sendCode(User $user): void
{
    $this->otpService->send($user, OTPTypeEnum::TYPE_EMAIL);
}

// 公共函数 send(Not济 $not济, OTPTypeEnum $type): void

使用 Enum 进行强制转换

为了避免从模型获取数据时返回字符串,请添加枚举转换,这在很多情况下非常有用。

protected $casts = [
    'type' => TypeEnum::class,
];

选修的

您还可以添加方法以方便使用 Enum。大多数情况下,我添加values方法来获取值数组,但使用Enum的想象力是没有限制的。

public static function values(): array
{
    return array_column(self::cases(), 'value');
}

public static function tryFromName(string $name): ?static
{
    return collect(static::cases())
        ->first(fn (UnitEnum $case) => $case->name === $name);
}

结论

一开始,枚举(Enum)可能看似简单,但它们在 PHP 开发中却蕴含了巨大的价值。通过熟练掌握枚举的使用技巧和最佳实践,您可以编写出更为清晰、易于维护且错误率更低的代码。那么,何必等待呢?现在就让您的 PHP 项目充分利用枚举的强大功能,为您的代码质量带来质的飞跃吧!

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 997人围观)