我有一个PHP5对象将消息传递给另一个,并希望为每条消息附加一个类型。例如,MSG_HOT
,MSG_WARM
和MSG_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;
}
我认为这很好,但对于看起来应该是一个简单的概念也是很多工作。
我错过了一个更好的选择吗?
答案 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 的两个第一个答案