替代PHP5中的枚举类型?

时间:2009-07-26 20:36:42

标签: php enums

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

字符串('MSG_HOT''MSG_WARM''MSG_COLD')很糟糕,因为我不可避免地会输入类似'MSG_WRAM'的内容,而事情会破裂。数字遇到同样的问题,也不太清楚。

定义工作:

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

但污染了全局命名空间,因此需要更详细的名称来确保唯一性。我不希望我的代码像APPLICATIONNAME_MESSAGES_TYPE_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;
}

我认为这很好,但对于看起来应该是一个简单的概念也是很多工作。

我错过了一个更好的选择吗?

4 个答案:

答案 0 :(得分:15)

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

e.g。

class Message
{
    const HOT  = 0;
    const WARM = 1;
    const COLD = 2;
}

答案 1 :(得分:5)

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

  • 使类抽象,以确保没有人试图实例化它
  • 添加一个静态数组,将数据库映射到字符串以打印友好消息
  • 实现静态__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];
        }
    }
    

我也可以使用Message :: $ enums来测试变量:

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

答案 2 :(得分:1)

您可以使用class constants

class Message
{
    const hot = 0;
    const warm = 1;
    const cold = 2;
}

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

答案 3 :(得分:0)

您可能希望查看提及两者的this question on stackoverflow 的两个第一个答案