使用接口和特征在 PHP 中编写灵活的枚举

使用接口和特征在 php 中编写灵活的枚举

php 枚举是一个强大的工具,用于定义一组固定的常量,同时使您能够将功能附加到这些常量。除了简单地保存值之外,枚举还可以实现接口并使用特征来扩展其功能。这使得它们在复杂的应用程序中更加灵活和可重用。

在这篇文章中,我们将通过将枚举与接口和特征相结合,将您的 php 枚举设计提升到一个新的水平。我们将了解如何创建提供标签、描述的枚举,甚至为表单中的选择输入生成选项。最后,您将拥有一个可重用的结构,可以轻松扩展并在所有枚举中保持一致的行为。

为什么将枚举与接口和特征一起使用?

枚举非常适合表示状态、状态或类型。然而,仅仅拥有一个常量列表通常是不够的。在许多情况下,您可能需要:

每个枚举案例的描述性标签或人类可读的名称。详细描述解释每个枚举案例的含义。用户界面中选择输入的结构化选项。

通过实现接口和使用特征,您可以确保您的枚举是一致的、可扩展的并且能够适应不断变化的需求。

立即学习“PHP免费学习笔记(深入)”;

创建枚举接口

我们将首先定义一个任何枚举都可以实现的接口,以确保它具有返回标签、描述和生成选择输入选项的方法。

界面如下:

<?phpnamespace appcontracts;interface enum{    /**     * get the label for the enum case.     *     * @return string     */    public function label(): string;    /**     * get the description for the enum case.     *     * @return string     */    public function description(): string;    /**     * generate an array of options with value, label, and description for select inputs.     *     * @return array     */    public static function options(): array;}

该接口定义了三个方法:

label:为每个枚举案例返回一个人类可读的名称。描述:提供每个枚举案例的详细描述。options:生成一个选项数组,其中每个选项包含枚举的值、标签和描述。这在构建表单时非常有用。

利用可重用逻辑的特征

我们可以通过使用特征来封装从枚举案例生成选项的通用逻辑来进一步增强我们的枚举。这就是 interactswithenumoptions 特征的用武之地。

 [            'value' => $case->value,            'label' => $case->label(),            'description' => $case->description(),        ], self::cases());    }}

此特征提供了一个可重用的 options() 方法,该方法循环遍历所有枚举案例 (self::cases()) 并返回一个数组,其中每个项目包含枚举案例的值、标签和描述。这在生成选择下拉选项时特别有用。

在枚举中实现接口和特征

现在让我们创建一个用于管理服务器状态的枚举。该枚举将实现 enum 接口并使用 interactswithenumoptions 特征来生成表单选项。

 'pending installation',            self::running => 'running',            self::stopped => 'stopped',            self::failed => 'failed',            default => throw new exception('unknown enum value requested for the label'),        };    }    public function description(): string    {        return match ($this) {            self::pending => 'the server is currently being created or initialized.',            self::running => 'the server is live and operational.',            self::stopped => 'the server is stopped but can be restarted.',            self::failed => 'the server encountered an error and is not running.',            default => throw new exception('unknown enum value requested for the description'),        };    }}

这里发生了什么?

枚举案例:我们定义了代表不同服务器状态的几种案例(例如,pending、running、stopped、failed)。标签和描述方法:label() 和description() 方法为每个枚举案例提供人类可读的名称和详细描述。这些方法使用匹配语句将每个案例映射到其相应的标签和描述。选项特征:interactswithenumoptions 特征用于自动生成表单选择输入的选项数组,其中包含案例的值、标签和描述。

通过可重用存根增加灵活性

如果您正在处理多个枚举,并且想要一种快速的方法来设置它们具有类似的功能,您可以使用一个可重用的存根,它结合了我们所涵盖的所有内容。这是此类存根的改进版本:

 'example label', // add labels for other cases            default => throw new exception('unknown enum value requested for the label'),        };    }    public function description(): string    {        return match ($this) {            self::example => 'this is an example description.', // add descriptions for other cases            default => throw new exception('unknown enum value requested for the description'),        };    }}

自定义存根:

将 {{ namespace }} 替换为枚举的实际命名空间。在 case 块内添加相关的枚举 case 并定义相应的标签和描述。

为什么这种模式有效

跨枚举的一致性:通过此设置,每个实现 enum 接口的枚举都必须提供标签和描述。这确保所有枚举都遵循相同的模式,使您的代码库更易于维护。特征的可重用性:interactswithenumoptions特征封装了生成选项的通用逻辑,可以在多个枚举之间重用,而无需重复代码。可扩展性:随着应用程序的增长,添加新的枚举案例或其他方法将成为一个无缝的过程。如果您需要修改选项的生成方式或添加新功能,您可以在特征或界面中集中执行此操作。

laravel blade 模板中的用法示例

让我们添加一个示例,说明如何在 laravel blade 模板中使用枚举。假设我们正在使用 serverstatus 枚举,并且希望使用 interactswithenumoptions 特征生成的选项生成一个选择输入,供用户选择服务器状态。

首先,确保您的控制器将枚举选项传递给视图。例如:

控制器示例:

<?phpnamespace apphttpcontrollers;use appenumsserverstatus;class servercontroller extends controller{    public function edit($id)    {        $server = server::findorfail($id);        $statusoptions = serverstatus::options(); // get enum options using the trait        return view('servers.edit', compact('server', 'statusoptions'));    }}

serverstatus::options() 方法将返回一个具有以下结构的数组:

[    ['value' => 'pending', 'label' => 'pending installation', 'description' => 'the server is currently being created or initialized.'],    ['value' => 'running', 'label' => 'running', 'description' => 'the server is live and operational.'],    // other cases...]

刀片模板示例:

在 blade 模板中,您现在可以使用 statusoptions 填充选择下拉列表并在用户选择状态时显示说明。

@extends('layouts.app')@section('content')    

Edit Server

id) }}" method="POST"> @csrf @method('PUT')
@foreach ($statusOptions as $option) status === $option['value']) selected @endif> {{ $option['label'] }} @endforeach
{{ $statusOptions[array_search($server->status, array_column($statusOptions, 'value'))]['description'] }}
const statusOptions = @json($statusOptions); function updateDescription() { const selectedStatus = document.getElementById('status').value; const selectedOption = statusOptions.find(option => option.value === selectedStatus); document.getElementById('statusDescription').textContent = selectedOption ? selectedOption.description : ''; } @endsection

解释:

控制器:在控制器中调用 serverstatus::options() 方法来生成选项数组,然后将其传递到 blade 视图。

刀片模板

创建 元素以允许用户选择服务器状态。使用 $statusoptions 数组填充选项。选择上的 onchange 事件会触发 updatedescription() javascript 函数,该函数会根据所选选项更新下拉列表下方的描述。最初,页面加载时会显示当前服务器状态的描述。

javascript:使用 @json 指令将 statusoptions 数组传递给 javascript,每当用户更改所选状态时 updatedescription() 函数都会更新描述。

此设置以用户友好的方式使用枚举选项,利用枚举中的标签和描述方法,在表单中提供丰富的体验。

结论

通过将 php 枚举与接口和特征相结合,您可以创建一个灵活、可扩展且可重用的模式,用于管理带有标签、描述和选择选项等附加逻辑的常量。即使应用程序的复杂性不断增加,这种设计也能确保整个代码库的一致性和可维护性。

通过我们构建的接口和特征结构,您现在可以以干净、有组织的方式实现枚举。无论您是处理服务器状态、用户角色还是支付状态,这种方法都将帮助您编写更清晰、更易于维护的代码。

编码愉快!

作者简介

nasrul hazim 是一位拥有超过 14 年经验的解决方案架构师和软件工程师。您可以在 github 上的 nasrulhazim 上探索他的更多作品。

以上就是使用接口和特征在 PHP 中编写灵活的枚举的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1248552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 20:36:19
下一篇 2025年12月8日 20:42:54

相关推荐

  • Comparison: Lithe vs Other PHP Frameworks

    如果您正在为下一个项目探索 PHP 框架,很自然会遇到 Laravel、Symfony 和 Slim 等选项。但是,是什么让 Lithe 与这些更强大、更知名的框架区分开来呢?以下是一些突出 Lithe 脱颖而出的注意事项。 1. 轻量级和性能 Lithe 的设计重点关注轻量级架构,提供快速高效的解…

    2025年12月9日
    000
  • Laravel API 课程

    Laravel 是构建强大 API 的最受欢迎的框架之一,现在,经过多年的规划,我很高兴终于能分享我的终极 Laravel API 课程!生活给我带来了一些麻烦,但感谢我超级支持的老板和 Treblle API 学院,我终于在令人惊叹的克罗地亚度过了一周的时间实现了这一目标。虽然我本可以更深入,但它…

    2025年12月9日
    000
  • 发布开源包:真的值得吗?

    很多人喜欢说开源社区是现代发展的支柱。但对于普通开发者来说,投入时间和精力来发布 python 和 php 包真的值得吗?一些人认为,为了获得知名度和机会,任何困难都是值得的。其他人则认为这只是一种“昂贵的爱好”,与付出的努力相比,回报即使不是不存在,也是微乎其微的。 现实情况是,大多数为开源包做出…

    2025年12月9日
    000
  • 如何使用雄辩?

    eloquent 是 laravel 的内置对象关系映射器 (orm),它提供了一种简单有效的方式与数据库交互。如何使用 eloquent,它允许您像 php 对象一样使用数据库表,并以其干净且富有表现力的语法而闻名。这是帮助您开始使用 eloquent 的指南。 如何使用 eloquent 的步骤…

    2025年12月9日
    000
  • Filament:从现有数据库架构生成资源

    在 filament 中,您可以使用 artisan 命令 make:filament-resource 生成 filament 资源。 此命令将生成一个空资源,您可以根据需要配置它。 如果您已经在 laravel 应用程序中完成了迁移和模型,则可以使用参数 –generate 让 fi…

    2025年12月9日
    000
  • 理解 Laravel 11 中 pluck() 和 select() 之间的区别

    laravel 是最流行的 php 框架之一,提供了一系列强大的数据操作方法。其中,pluck() 和 select() 在处理集合时经常使用。尽管它们看起来相似,但它们的目的不同。在本文中,我们将探讨这两种方法之间的差异,解释何时使用每种方法,并提供实际的编码示例来演示它们在 laravel 11…

    2025年12月9日
    000
  • 为什么 Docker 近年来正在失去优势

    近年来,docker一度成为开发领域的明星工具,以其突破性的技术彻底改变了软件开发。最初,docker 通过其轻量级容器化技术显着简化了开发和部署流程。然而,到了 2024 年,这项技术的缺点越来越明显。 早期的辉煌 不久前,Docker 成功解决了“它在我的机器上可以运行,但在你的机器上不行”的老…

    2025年12月9日 好文分享
    000
  • 为什么你应该为开源付费

    几乎每个开发人员每天都会使用开源项目,无论是在 VS Code 中编写代码、使用 TailwindCSS 加速开发,还是使用最流行的 PHP 框架 Laravel 构建强大的 Web 应用程序。我们不要忘记用于创建管理面板的 FilamentPHP。 这些项目不是鬼建的,而是由鬼魂建造的。它们是由人…

    2025年12月9日
    000
  • SharpAPI Laravel 集成指南

    欢迎来到sharpapi laravel 集成指南!该存储库提供了有关如何将 sharpapi 集成到下一个 laravel ai 应用程序中的全面的分步教程。无论您是希望通过**人工智能支持的功能**还是自动化工作流程来增强您的应用程序,本指南都将引导您完成从身份验证到进行 api 调用和处理响应…

    2025年12月9日
    000
  • PHP函数缓存的未来发展趋势

    PHP 函数缓存的未来发展趋势 随着 PHP 应用的规模和复杂性的不断增长,函数缓存已成为提高性能的关键技术。本文将探讨 PHP 函数缓存的未来发展趋势,并提供一个实战案例。 趋势 1:对 JIT 编译的支持 JIT(即时编译)是一种编译技术,可以在运行时将 PHP 代码编译成机器代码。这可以显著提…

    2025年12月9日
    000
  • 超越 AES — 使用 XChaCha20 对 Laravel 进行现代加密

    在当今的数字环境中,数据加密是每个 web 应用程序的重要组成部分。本文探讨了我为什么开发一个利用 libsodium 的 xchacha20-poly1305 加密功能的包,以及它如何增强 laravel 应用程序的安全性,同时最大限度地减少开销。 动机和要求 laravel 的框架 crypt …

    2025年12月9日
    000
  • 时间数据系列:故事的其余部分

    时间数据系列:故事的其余部分 – adatosystems 自从我写有关 php zmanim 的文章以来已经有一段时间了——我用它所做的工作以及我在实现它时学到的东西。但尽管耽误了时间,我始终打算继续谈话。这就是我们今天要做的 在我的第一篇文章中,我解释了如何安装和开始使用 php z…

    2025年12月9日
    000
  • php网络编程指南:RESTful API开发指南

    如何使用 laravel 创建 restful api?安装 laravel。配置路由,通过 routes/api.php 定义 crud 操作路由。创建控制器 todocontroller,用于处理 crud 操作。添加代码注释,以清楚地描述每个操作的功能。使用 postman 安装并调用 api…

    2025年12月9日
    000
  • PHP 函数事件处理技术如何与其他框架集成?

    php 函数事件处理技术允许你在函数和方法上定义事件,并通过与其他框架集成来扩展其功能。通过与 laravel 和 symfony 框架集成,你可以注册和触发事件以执行特定动作。实际应用中,你可以使用它与 swiftmailer 框架集成,在用户创建时通过事件处理程序发送欢迎邮件。 PHP 函数事件…

    2025年12月9日
    000
  • 如何使用 Laravel 框架扩展 PHP 函数的日志记录?

    laravel 提供了一种方法来扩展 php 函数的日志记录:安装 monolog/monolog 扩展。在 config/logging.php 中配置 custom 日志通道。使用 illuminatesupportfacadeslog 门面记录自定义日志。 使用 Laravel 扩展 PHP …

    2025年12月9日
    000
  • php函数日志记录日志分析方法问题解答

    php 中的 error_log() 函数用于记录错误信息。它接受两个参数:要记录的消息和一个整数标志,用于指定消息的级别和处理方式。日志级别从 0(标准消息)到 4(异常)。用户可以实时查看日志文件,使用 tail -f 命令。为了避免日志文件过大,可以考虑使用轮转机制或定期清理过时的日志文件。如…

    2025年12月9日
    000
  • 如何在 PHP 函数中记录异常?

    在 php 函数中记录异常有两种方法:使用 try-catch 块捕获异常,并在 catch 块中处理它们。使用日志记录库记录异常,例如 monolog 或符合 psr-3 标准的库。 如何在 PHP 函数中记录异常? 异常是 PHP 中用来处理错误和异常情况的机制。在函数中记录异常可以确保即使在意…

    2025年12月9日
    000
  • PHP,永不倒下的大象!

    照片由 Ben Griffiths 在 Unsplash 上拍摄 PHP是一门广受好评的语言,同时也受到其他人的批评,有人说它正在消亡,但真的是这样吗,值得花时间学习PHP吗? PHP PHP 是 Rasmus Lerdorf 在 90 年代开发的一种编程语言,最初它被开发为一种服务器端语言,帮助 …

    2025年12月9日
    000
  • 小型 Swoole 实体管理器

    我很高兴向大家介绍 Small Swoole Entity Manager。 它是一个围绕 Swoole(和 OpenSwoole)构建的 ORM。 它支持异步连接到: MySQLPostgres小型 Swoole Db(Swoole Tables 之上的关系层) 目前仅提供核心包; Symfony…

    2025年12月9日
    000
  • 来认识一下 phpvm:您的新 PHP 永远最好的朋友!

    你们好,php 爱好者和版本杂耍忍者!您是否厌倦了 php 版本探戈?您知道吗,您不断地在 php 版本之间切换的速度比猫视频传播得还快?好吧,戴上你的派对帽子吧,因为我有一些令人兴奋的消息,这将使你的开发生活更轻松(我敢说,更有趣)! phpvm 简介:您梦想中的 php 版本管理器 想象一下:您…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信