我有一个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);
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)
我也使用了一个带有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)
| 归档时间: |
|
| 查看次数: |
6515 次 |
| 最近记录: |