轻量级的枚举值对象实现

v4.1 2023-12-07 11:36 UTC

This package is auto-updated.

Last update: 2024-09-07 13:11:30 UTC


README

PHP中轻量级的枚举值对象实现。

安装

使用 Composer 安装该包

composer require intraworlds/enum

用法

扩展 IW\Enum 并添加任意常量,这些常量将成为你的枚举键。

final class Hash extends Enum
{
  const MD5 = 'md5';
  const SHA1 = 'sha1';
}

通过调用静态函数 <classname>::<key>() 获取枚举值的实例。

$md5 = Hash::MD5();

使用此库的主要优势当然是类型提示。因此,给定实例在 DDD 值对象原则上是始终有效的。

function crack(Hash $hash) {
  echo 'cracking ... ' . $hash; // notice that enum is implementing __toString() method
}

crack(Hash::SHA1()); // cracking ... sha1
crack(Hash::SHA1);   // throws TypeError

该函数返回一个单例,因此你可以使用 === 进行比较。

var_dump($md5 === MD5()); // true
var_dump($md5 === SHA1()); // false

实际上,你必须使用 === 进行严格比较。使用 == 时,PHP 只会比较对象是否属于同一类。

var_dump($md5 == MD5()); // true
var_dump($md5 == SHA1()); // true - DON'T use == comparison!

使用方法 getValue() 获取实际值

var_dump($md5->getValue() === Hash::MD5); // true

由于 松散比较,switch 语句必须由值定义。

switch ($hash->getValue()) {
  case Hash::MD5: ...
  case Hash::SHA1: ...
}

你可以使用方法 search() 通过值获取枚举实例。

$contentType = ContentTypeEnum::search(apache_request_headers()['Content-Type']);

PHPStan 集成

此库附带 PHPStan 扩展,提供魔法方法反射。只需将以下配置添加到您的 phpstan.neon

services:
    -
        class: IW\PHPStan\Reflection\EnumMethodsReflectionExtension
        tags:
            - phpstan.broker.methodsClassReflectionExtension

替代方案

  • 我们从库 myclabs/php-enum 中汲取了大部分灵感。它是一个很好的实现,但它缺少单例,并且没有针对 PHP7 进行优化。
  • PHP 的 SplEnum 需要一个扩展,并且也不支持单例。

许可证

此包的所有内容均受 MIT 许可证 的许可。