替代PHP5中的枚举类型?

Bri*_*ian 9 php enums

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

字符串('MSG_HOT','MSG_WARM''MSG_COLD')是不好的,因为我不可避免地会输入类似的东西'MSG_WRAM',事情会破裂.数字遇到同样的问题,也不太清楚.

定义工作:

define('MSG_HOT', 1);
define('MSG_WARM', 2);
define('MSG_COLD', 3);
Run Code Online (Sandbox Code Playgroud)

但污染全局命名空间,因此需要更详细的名称来确保唯一性.我宁愿不让我的代码乱丢东西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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

hob*_*ave 16

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

例如

class Message
{
    const HOT  = 0;
    const WARM = 1;
    const COLD = 2;
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以这样使用:`Message :: HOT`.我也相信`Message`应该被声明为`abstract`. (6认同)

gra*_*rks 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];
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

if (!array_key_exists($is_it_valid, Message::$enums)
Run Code Online (Sandbox Code Playgroud)