PHP5中枚举类型的替代方案?

PHP5中枚举类型的替代方案?,php,enums,Php,Enums,我有一个PHP5对象将消息传递给另一个PHP5对象,并且希望为每个消息附加一个类型。例如,MSG\u HOT、MSG\u WARM和MSG\u COLD。如果PHP5有一个enum类型,我可能会用它来定义消息类型,但是(除非我弄错了)没有这样的动物。我已经研究了几个选项: 字符串('MSG\u HOT','MSG\u WARM',和'MSG\u COLD')是不好的,因为我不可避免地会键入类似'MSG\u WRAM'的内容,然后事情就会破裂。数字也面临同样的问题,而且也不太清楚 定义工作: de

我有一个PHP5对象将消息传递给另一个PHP5对象,并且希望为每个消息附加一个类型。例如,
MSG\u HOT
MSG\u WARM
MSG\u COLD
。如果PHP5有一个enum类型,我可能会用它来定义消息类型,但是(除非我弄错了)没有这样的动物。我已经研究了几个选项:

字符串(
'MSG\u HOT'
'MSG\u WARM'
,和
'MSG\u COLD'
)是不好的,因为我不可避免地会键入类似
'MSG\u WRAM'
的内容,然后事情就会破裂。数字也面临同样的问题,而且也不太清楚

定义工作:

define('MSG_HOT', 1);
define('MSG_WARM', 2);
define('MSG_COLD', 3);
但是会污染全局名称空间,因此需要更详细的名称来确保唯一性。我不希望我的代码中充斥着
APPLICATIONNAME\u MESSAGES\u TYPE\u HOT

最后,我可以使用类名来区分类型,如下所示:

class MessageHot extends Message {}
class MessageWarm extends Message {}
class MessageCold extends Message {}
class Message
{
    public function Type()
    {
        return get_class($this);
    }
    public function Data()
    {
        return $this->data;
    }
    public function __construct($data)
    {
        $this->data = $data;
    }
    private $data;
}
我认为这很好,但对于一个看似简单的概念来说,这也是一个很大的工作

我错过了更好的选择吗?

您可以使用:


一个非常常见的约定是在PHP中使用类常量

e、 g


为此,我还使用了一个带有常量的类。我补充如下

  • 使类抽象,以确保没有人试图实例化它
  • 添加一个静态数组,将常量映射到字符串以打印友好消息
  • 实现一个静态_toString()方法来执行前面的

    abstract class Message {
        const HOT = 0;
        const WARM = 1;
        const COLD = 2;
    
        public static $enums= array(
            self::HOT => "hot",
            self::WARM => "warm",
            self::COLD => "cold"
        );
    
        public static __toString($enum) {
            return self::$enums[$enum];
        }
    }
    
我还可以使用消息::$enums来测试变量:

if (!array_key_exists($is_it_valid, Message::$enums)

你可能想看看这两个问题的第一个答案

  • 使用抽象类实现这一点的方法

嘿,我发誓我回答的时候页面上没有这个。Greg,大多数PHP(PEAR、Zend等)编码标准要求对常量名称使用所有大写字母。这当然有助于代码识别。当您使用define创建常量时,这样的约定非常重要(尽管我发现所有的大写字母都很难看,所以我更喜欢使用“k”前缀,就像在kConstantName中一样),但对于类常量来说,这并不是必需的。如果看到某个类::foo(或self::foo或static::foo),除了常量之外,foo还能是什么?除了像反射这样非常时髦的东西之外,你只能看到这样引用的类常量。你可以这样使用:
Message::HOT
。我还认为
Message
应该声明为
abstract
发现使用_u-toString来实现这一点是不明智的,因为比我使用的新的PHP版本都在抱怨它。因此,最好对此功能使用不同的名称。
abstract class Message {
    const HOT = 0;
    const WARM = 1;
    const COLD = 2;

    public static $enums= array(
        self::HOT => "hot",
        self::WARM => "warm",
        self::COLD => "cold"
    );

    public static __toString($enum) {
        return self::$enums[$enum];
    }
}
if (!array_key_exists($is_it_valid, Message::$enums)