关于php:php5中枚举类型的替代方法?

Alternative to enum types in PHP5?

我有一个php5对象将消息传递给另一个,并希望为每个消息附加一个类型。例如,MSG_HOTMSG_WARMMSG_COLD。如果php5有一个枚举类型,我可能会用它来定义消息类型,但是(除非我弄错了)没有这样的动物。我看了几个选项:

字符串('MSG_HOT''MSG_WARM''MSG_COLD'是坏的,因为我不可避免地会键入类似'MSG_WRAM'的类型,事情就会破裂。数字也有同样的问题,而且也不太清楚。

定义工作:

1
2
3
define('MSG_HOT', 1);
define('MSG_WARM', 2);
define('MSG_COLD', 3);

但是会污染全局命名空间,因此需要更详细的名称来确保唯一性。我不希望我的代码中有像APPLICATIONNAME_MESSAGES_TYPE_HOT这样的东西。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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中使用类常量。

例如

1
2
3
4
5
6
class Message
{
    const HOT  = 0;
    const WARM = 1;
    const COLD = 2;
}


我还使用了一个带有consts的类。我添加了以下内容

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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来测试变量:

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


可以使用类常量:

1
2
3
4
5
6
7
8
9
10
class Message
{
    const hot = 0;
    const warm = 1;
    const cold = 2;
}

foo(Message::hot);
foo(Message::warm);
foo(Message::cold);


您可能想看看stackoverflow上这个问题的前两个答案。同时提到

  • 一种使用抽象类进行此操作的方法
  • 脾延伸