2009-07-26 58 views
6

我有一个PHP5对象将消息传递给另一个,并且想要为每条消息附加一个类型。例如,MSG_HOT,MSG_WARMMSG_COLD。如果PHP5有一个枚举类型,我可能会使用它来定义消息类型,但是(除非我错了)没有这样的动物。我已经看了几个选择: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; 
} 

这是好事,我想,但也有很多的东西好像它的工作应该是一个简单的概念。

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

回答

13

一个非常普遍的惯例是在PHP中使用类常量。

例如

class Message 
{ 
    const HOT = 0; 
    const WARM = 1; 
    const COLD = 2; 
} 
+5

你可以像这样使用它:`Message :: HOT`。我也相信`Message`应该被声明为`abstract`。 – philfreo 2009-12-26 02:55:31

1

你可以使用class constants

class Message 
{ 
    const hot = 0; 
    const warm = 1; 
    const cold = 2; 
} 

foo(Message::hot); 
foo(Message::warm); 
foo(Message::cold); 
+1

嘿要做到这一点,我发誓这当我回答时没有在页面上。格雷格,大多数PHP(PEAR,Zend等)编码标准都要求对常量名称使用ALL CAPS。它肯定有助于代码识别。 – hobodave 2009-07-26 20:47:03

+0

当你用define创建你的常量时,这样的约定是非常重要的(尽管我发现全部大写字母对接 - 丑陋,所以我更喜欢'k'前缀,就像在kConstantName中那样),但对类常量。如果你看到SomeClass :: foo(或者self :: foo或者static :: foo),除了常量还有什么可以成为的呢?并且缺少像反射这样非常时髦的东西,你只会看到像这样引用的类常量。 – 2012-07-27 23:37:41

5

我还使用一类具有consts这一点。我添加以下

  • 使抽象类,以确保没有人尝试实例它
  • 补充的是,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 :: $枚举,以测试变量:

if (!array_key_exists($is_it_valid, Message::$enums)