nxtlvlsoftware / enums
为PHP带来枚举功能!
Requires
- symfony/console: ^4.2
Requires (Dev)
- illuminate/view: ^5.7
- nikic/php-parser: ^4.2
- phpunit/phpunit: ^8
Suggests
- nxtlvlsoftware/static-constructors: Specify enums in the static constructor to use objects as enum values.
This package is not auto-updated.
Last update: 2023-09-11 10:57:17 UTC
README
为PHP带来基于类的枚举功能!
关于
此包为您提供了快速简便地在PHP代码库中实现枚举的方法。此包的目的是快速定义枚举,并尽可能地减少代码量。这是通过从提供类的常量中读取,然后通过具有与常量相同名称的魔法静态方法提供对这些常量的访问来实现的。我们使用这种方法将底层常量值封装在一个在整个运行时保持不变的不变对象中。使用对象而不是常量的底层值有助于复制其他编程语言中枚举的行为(即使底层是int,枚举也不会被视为int),并旨在通过隐藏底层值来减少对“魔法数字”(很少改变但不可保证保持不变的常量值)的依赖。
以下是一个快速示例
final class MyEnum extends nxtlvlsoftware\enums\Enum { protected const ENUM_INT = 0; protected const ENUM_STRING = "string"; }
然后我们可以通过调用具有等效名称的类的静态方法来访问这些声明的枚举
MyEnum::ENUM_INT(); MyEnum::ENUM_STRING();
在这个例子中,我们使用受保护的常量来隐藏它们,我们不希望通过静态方法之外的任何方式访问它们。枚举类也被声明为final,以防止其他类扩展它。
安装
您只需要使用Composer执行以下操作即可安装
$ composer require nxtlvlsoftware/enums
或者直接将其添加到您的composer.json清单中
{ "require": { "nxtlvlsoftware/enums": "*" } }
库将直接开始工作,只需确保您扩展了基本枚举类,否则静态方法将不会在您的类上定义。
IDE自动完成
您可能会想,“酷,但我的IDE甚至不知道这些枚举的存在!”您是对的。像PhpStorm这样的IDE甚至不知道这些魔法方法的存在,这就是为什么我们提供了“IDE辅助生成器”。这是一个简单的CLI应用程序,它将扫描目录中的枚举类,并生成一个文件,比如这个文件,这将告诉您的IDE,当代码运行时,这些方法实际上将存在。
如果您使用Composer全局安装此包,命令将可在您的机器上的任何地方作为enums
或任何依赖此包的项目将链接脚本到项目的bin目录(默认为vendor/bin/enums
)。
您至少需要定义一个要扫描的目录以及占位符的位置和文件名。
$ php vendor/bin/enums generate --dir /Users/Jack/Projects/MyProject/src --dir /Users/Jack/Projects/MyProject/vendor --out /Users/Jack/Projects/MyProject/enum_stubs.php
此命令将扫描项目的源目录及其所有已安装的Composer依赖项,并将IDE辅助占位符生成到enum_stubs.php
文件中。
您可以使用快捷选项名称-d
指定目录和-o
指定输出文件,而不是使用完整名称。创建一个简单的脚本或PhpStorm配置来快速运行此命令可能会提高您的效率,因为每次更新枚举类时都要输入整个命令将会非常繁琐。
内部机制
在类上第一次访问枚举时,库使用反射来获取所有定义的常量,然后存储一个类的新实例(在数组中),该实例内部存储枚举值和名称。这使我们能够实现将枚举名称转换为字符串的魔术方法,以便在调试过程中显示枚举名称。该值存储起来,以供将来可能的功能使用,该功能将允许在特殊用例中以枚举对象代替返回底层值。
问题
发现这个库有问题?请确保在问题跟踪器上打开一个问题,我们会将其解决!
本存储库的内容采用Unlicense许可。完整副本的许可协议可在此处找到。