PHP 8.1 策略枚举实战:从基础到架构级应用指南

AI 概述
PHP 8.1 引入枚举,它作为预定义常量集合可改进应用设计。普通枚举可作类型使用,但处理数据库有局限,支持后备值的枚举(可分配 string 或 int 值)可解决此问题。枚举还能像普通类一样定义方法,与 match 操作符结合使用可实现多种功能,如为优先级分配颜色。此外,枚举方法可进一步扩展,如根据优先级获取正确通知发送器,明智使用枚举能设计出更干净、易维护的代码库。
目录
文章目录隐藏
  1. 为什么使用枚举?
  2. 支持后备值的枚举
  3. 枚举方法
  4. 进一步扩展枚举方法
  5. 结语

PHP 8.1 枚举实战:从基础到架构级应用指南

枚举(通常称为 Enums)是软件开发中的一个强大工具,如果正确使用,它可以在应用程序的架构设计中发挥重要作用。以前版本,PHP 没有支持这种数据类型,但从 PHP 8.1 版本开始,终于添加了它,这带来了许多可能性。在本文中,让我们回顾如何战略性地使用它们来改进我们的应用程序。

为什么使用枚举?

基本上,枚举是一种数据类型,它作为一个预定义常量的集合。例如,如果我们正在构建一个 ToDo 应用程序,我们可以使用 枚举 来表示任务的优先级。

enum Priority
{
    case LOW;
    case NORMAL;
    case HIGH;
}

使用 枚举 来表示任务的优先级已经为我们的设计带来了重要的改进,而不是使用字符串来表示它,我们可以将它作为 Task 实体中的类型使用,因此在代码库中处理这个实体时,我们可以轻松识别优先级属性的可能值,而不必猜测或检查数据库。

final class Task
{
    public function __construct(
        public string $title,
        public string $description,
        public Priority $priority,
    ) {
    }
}

$task = new Task(
    title: 'My First Task',
    description: 'Do something',
    priority: Priority::HIGH,
);

但是上面的代码在处理数据库时有一个问题,因为 枚举 是由对象表示的,我们无法轻松地将它用于保存数据到数据库中,但我们有另一种类型的 枚举 来拯救局面。

支持后备值的枚举

如上所述,枚举 是由对象表示的,但 PHP 还支持 支持后备值的枚举(Backed Enums),它们可以分配一个值。内部它们仍然是由对象表示的,但由于它们是由值表示的,我们可以轻松使用这个值来序列化枚举,例如保存到数据库中。让我们改进我们的 Priority 枚举,并将其转换为 支持后备值的枚举

enum Priority: string
{
    case LOW = 'low';
    case NORMAL = 'normal';
    case HIGH = 'high';
}

Task 实体的实例化可以保持与之前相同,并且仍然有效,但我们也可以以不同的方式使用它。想象一下,我们从 UI 接收优先级作为一个字符串值,并在实例化 Task 实体时需要分配枚举。我们可以使用这种方法:

$task = new Task(
    title: 'My First Task',
    description: 'Do something',
    priority: Priority::from($priority),
);

请记住,我们只能为 支持后备值的枚举 使用 string 或 int 类型。

枚举方法

就像普通类一样,我们也可以在枚举中定义方法,当我们将 match 操作符与这些方法结合使用时,这带来了许多可能性。想象一下,现在我们想为 ToDo 应用程序中的每个优先级分配一个特定的颜色。我们可以通过在 Priority 枚举中创建一个方法来轻松实现这一点。

enum Priority: string
{
    case LOW = 'low';
    case NORMAL = 'normal';
    case HIGH = 'high';

    public function color(): string
    {
        match ($this) {
            self::LOW => 'green',
            self::NORMAL => 'blue',
            self::HIGH => 'red',
        };
    }
}

$task = new Task(
    title: 'My First Task',
    description: 'Do something',
    priority: Priority::HIGH,
);

$task->priority->color();
// 'red'

进一步扩展枚举方法

我们上面看到,我们可以在枚举中定义方法,这为我们的应用程序打开了许多可能性。我们看到的例子只是为优先级返回一个特定的颜色,但我们可以通过这些方法进一步扩展这个边界。

想象一下,我们需要为每个任务向用户发送通知,但每个优先级的通知类型不同。我们有许多不同的方式来处理这种情况,其中一种解决方案是使用我们的 Priority 枚举来获取所需的正确类型的通知发送器。首先,我们需要为通知发送器定义一个契约。

interface NotificationSender
{
    public function send(Task $task): void;
}

现在我们已经定义了契约,我们需要实现我们需要的每种类型的发送器,为这个例子的简单起见,我不会提供这些实现的代码,只列出我们可能拥有的不同实现。

final class EmailSender implements NotificationSender
{
    public function send(Task $task): void
    {
        // Send email logic here
    }
}

final class SlackSender implements NotificationSender
{
    public function send(Task $task): void
    {
        // Send slack notification logic here
    }
}

final class PhoneMessageSender implements NotificationSender
{
    public function send(Task $task): void
    {
        // Send SMS logic here
    }
}

现在有了我们的通知发送器实现,我们可以在 Priority 枚举中实现一个简单的方法,它将为每个优先级类型检索正确的发送器。

enum Priority: string
{
    case LOW = 'low';
    case NORMAL = 'normal';
    case HIGH = 'high';

    public function notificationSender(): NotificationSender
    {
        match ($this) {
            self::LOW => new EmailSender(),
            self::NORMAL => new SlackSender(),
            self::HIGH => new PhoneMessageSender(),
        };
    }
}

使用这个简单的方法,在创建新任务时,我们可以轻松使用下面的方法发送通知。

$task = new Task(
    title: 'My First Task',
    description: 'Do something',
    priority: Priority::HIGH,
);
 
$task->priority->notificationSender()->send($task);

结语

枚举 为我们提供了无限的可能性来改进我们的应用程序,如果我们明智地使用它们,我们可以设计出更干净、更易维护的代码库。我的目标是通过本文展示,我们可以超越简单的辅助函数,如获取颜色或标签,而是使用 枚举 来解决更复杂的问题,并将它们作为应用程序 架构 和 设计 的核心部分。

以上关于PHP 8.1 策略枚举实战:从基础到架构级应用指南的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » PHP 8.1 策略枚举实战:从基础到架构级应用指南

发表回复