PHP5中枚举类型的替代方案?
我有一个PHP5对象将消息传递给另一个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
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]; } }
if (!array_key_exists($is_it_valid, Message::$enums)
你可能想看看这两个问题的第一个答案
- 使用抽象类实现这一点的方法
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)