Alternative to enum types in PHP5?
我有一个php5对象将消息传递给另一个,并希望为每个消息附加一个类型。例如,
字符串(
定义工作:
但是会污染全局命名空间,因此需要更详细的名称来确保唯一性。我不希望我的代码中有像
最后,我可以使用类名来区分类型,比如:
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
15abstract 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 |
可以使用类常量:
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上这个问题的前两个答案。同时提到
- 一种使用抽象类进行此操作的方法
- 脾延伸