我知道PHP没有本地枚举。但是我已经习惯了Java世界中的他们。我很乐意使用枚举来提供IDE的自动完成功能可以理解的预定义值。
常量可以解决问题,但是存在名称空间冲突问题,并且(或者实际上是 因为
)它们是全局的。数组没有名称空间问题,但是它们太含糊,可以在运行时覆盖它们,而IDE很少(从不?)不知道如何自动填充键。
您通常使用任何解决方案/解决方法吗?有谁回想起PHP家伙是否对枚举有任何想法或决定?
根据使用情况,我通常会使用类似以下的 简单 内容:
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
$today = DaysOfWeek::Sunday;
但是,其他用例可能需要更多的常量和值验证。根据以下有关反射的评论以及其他一些注意事项,这是一个扩展的示例,可能会更好地服务于更广泛的案例:
abstract class BasicEnum {
private static $constCacheArray = NULL;
private static function getConstants() {
if (self::$constCacheArray == NULL) {
self::$constCacheArray = [];
}
$calledClass = get_called_class();
if (!array_key_exists($calledClass, self::$constCacheArray)) {
$reflect = new ReflectionClass($calledClass);
self::$constCacheArray[$calledClass] = $reflect->getConstants();
}
return self::$constCacheArray[$calledClass];
}
public static function isValidName($name, $strict = false) {
$constants = self::getConstants();
if ($strict) {
return array_key_exists($name, $constants);
}
$keys = array_map('strtolower', array_keys($constants));
return in_array(strtolower($name), $keys);
}
public static function isValidValue($value, $strict = true) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict);
}
}
通过创建一个扩展BasicEnum的简单枚举类,您现在可以使用方法来进行简单的输入验证:
abstract class DaysOfWeek extends BasicEnum {
const Sunday = 0;
const Monday = 1;
const Tuesday = 2;
const Wednesday = 3;
const Thursday = 4;
const Friday = 5;
const Saturday = 6;
}
DaysOfWeek::isValidName('Humpday'); // false
DaysOfWeek::isValidName('Monday'); // true
DaysOfWeek::isValidName('monday'); // true
DaysOfWeek::isValidName('monday', $strict = true); // false
DaysOfWeek::isValidName(0); // false
DaysOfWeek::isValidValue(0); // true
DaysOfWeek::isValidValue(5); // true
DaysOfWeek::isValidValue(7); // false
DaysOfWeek::isValidValue('Friday'); // false
附带说明一下,任何时候我在 不会更改数据的静态/ const类上
至少使用一次反射(例如在枚举中)时,都会缓存这些反射调用的结果,因为每次都使用新的反射对象最终将对性能产生显着影响(存储在多个枚举的关联数组中)。
现在,大多数人 终于 升级到了至少5.3,并且SplEnum
可以使用,这当然也是一个可行的选择-只要您不介意在整个代码库中具有实际枚举 实例
的传统不直观的概念。在上面的示例中,BasicEnum
and DaysOfWeek
根本不能实例化,也不应该实例化。
问题内容: 当我使用DataContractJsonSerializer序列化枚举值时,它将序列化枚举的数值,而不是字符串名称。 IE浏览器: 序列化foo.bar的值将返回“ 0”,而不是“ bar”。 我更喜欢它,是否有一种方法可以覆盖它? 编辑: 因为我不想更改序列化程序,所以我使用了一个简单的变通办法。 我在类中公开了要序列化的属性,该属性在值上调用ToString,即: 问题答案: 看起
问题内容: Enumeration <有区别吗?扩展ZipEntry>和Enumeration ?如果是这样,有什么区别? 问题答案: 拥有其中一种后,您在做什么上没有实际差异,因为type参数仅在“输出”位置使用。另一方面,在您可以 用作 其中一个的方面有很大的不同。 假设您有一个-您无法将其传递给作为其参数之一的方法。您 可以 将其传递给采用方法。 当您有一个在输入和输出位置都使用type参数
问题内容: 枚举具有获取枚举常量的方法,并且在具有 我发现的名称的类中存在的相同类型的方法都给出相同的输出。那还有什么其他区别。如果没有区别,那么为什么要添加JSL ? 问题答案: 包括该方法的原因是它可以与任何方法一起使用。相比之下, 用于特定方法的方法仅适用于该特定方法…,因为类不能被多态使用。 显然,该方法仅在您实现 需要 针对多种类型使用的代码的情况下才真正有用……而泛型则不会削减它。
主要内容:声明常量,实例,VB.Net打印和显示常量,声明枚举,实例常量指的是程序在执行过程中可能不会改变的固定值。 这些固定值也被称为文字。 常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字。 也有枚举常量。 常量的处理方式与常规变量一样,只是它们的值在定义之后无法修改。 枚举是一组命名的整数常量。 声明常量 在VB.Net中,使用语句声明常量。 语句用于模块,类,结构,过程或块级别,以代替文字值。 语句的语法是: 其中, attribut
问题内容: 这件事让我困扰了一阵子。我之前曾问过一些问题,但措辞可能很拙劣,而且例子太抽象了。所以目前尚不清楚我实际上在问什么。我会再尝试。并且请不要下结论。我希望这个问题根本不容易回答! 为什么我不能在Java中使用带有泛型类型参数的枚举? 问题不在于语法上为什么不可能做到这一点。我知道这只是不受支持。问题是:为什么JSR人员会“忘记”或“忽略”这个非常有用的功能?我无法想象与编译器相关的原因,
我对的枚举有问题。在方法中有两个枚举:和。是内置的Spring枚举,它完美地从String转换为Enum: 但是当我打电话的时候 我阅读并测试了: 带枚举的Spring的@RequestParam Spring Boot能够接受枚举作为请求参数 枚举作为Spring Boot Rest中的请求参数 如何在RequestParm中将多个值转换为枚举? @RequestParam defaultval