PHP类常量的单字母前缀?

时间:2010-03-19 17:25:30

标签: php constants

我注意到很多(所有?)PHP常量都有一个单字母前缀,如E_NOTICET_STRING等。定义一组彼此协同工作的类常量,你更愿意遵循类似的做法,还是更喜欢更加冗长?

class Foo {
    // let's say 'I' means "input" or some other relevant word
    const I_STRING = 'string';
    const I_INTEGER = 'integer';
    const I_FLOAT = 'float';
}

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

7 个答案:

答案 0 :(得分:6)

直到5.3 PHP仅限于一个全局命名空间。这意味着用define声明或内置到语言中的任何常量都需要一个前缀来自行分区 - 如果愿意,可以使用便宜的命名空间。

关于常量本身:虽然E_NOTICEERROR_NOTICE更容易输入,但前者的主要缺点是不能自我记录。在全局上下文中,不仅需要按前缀对常量进行分区,这些前缀也应尽可能具有描述性。

类常量是一个稍微不同的野兽,因为你总是按类名引用它们 - 将内置分区。所以你最终会得到Account::STATUS_CONFIRMEDAccount::STATUS_BANNED。但如果我计划有几十种状态,我会将它们放在他们自己的班级,例如AccountStatus::CONFIRMEDAccountStatus::BANNED

无论您为常量决定什么命名约定,主要考虑因素都是分区和自我记录的名称(详细程度)。

答案 1 :(得分:2)

对于像常数这样的东西我更喜欢冗长。我发现它使代码更容易理解(或者对于没有编写它的人),并且因为我使用IDE,所以我通常不必担心在编码时键入整个长名称。

答案 2 :(得分:2)

在课堂上,你最好不要使用前缀,除非它们在上下文中非常有意义。您在常量中看到的字母前缀是因为PHP引入时没有名称空间;但是类是某种形式的命名空间,所以这不是必需的。

但是,如果您仍然要使用前缀,我建议您使用最有意义的前缀 - 即完整的单词而不是单个字母。我不会猜到I意味着INPUT

答案 3 :(得分:0)

我更喜欢更详细

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

这使得下一个必须处理代码的人更容易阅读代码。您可以考虑将自己的框架前缀添加到常量(例如:XYZ_INPUT_STRING),这将减少与您可能使用的其他组件发生冲突的变化。更冗长的缺点是变量名称往往会变长,但是一个好的IDE支持代码完成,因此您不必键入整个变量名称。

答案 4 :(得分:0)

大多数PHP常量都有前缀的原因是命名它们,所以。例如,在E_USER_ERROR中,E_执行两项操作:

  1. 它告诉您该常量与错误处理系统
  2. 有关
  3. 如果你想在你的应用程序中使用一个名为USER_ERROR的常量,那就可以了。
  4. 在PHP5中,我们可以使用类常量,因此不再需要命名空间。例如,参见DATE_ constants。相当于DATE_ATOM的是DateTime::ATOM,其中DateTime是处理日期的PHP类。 DATE_ATOM仍然存在,大概是出于遗产原因,但是今天创建的常量,它只会被称为DateTime::ATOM

    在您的情况下,定义一个具有这些常量的输入类可能是有意义的:

    class input {
        public const STRING='string';
        public const INTEGER = 'integer';
        public const FLOAT = 'float';
    }
    

答案 5 :(得分:0)

与C和朋友不同,在动态语言中,我们很少(如果有的话)需要预先声明的常量。因为描述性的字符串值工作得很好。使用

没有任何实际好处
if($account->status == AccountStatus::CONFIRMED)

相比
if($account->is('confirmed'))

后者更具可读性,需要更少的代码。

在开始撰写愤怒的评论之前,请看看jQuery是如何做到的:http://api.jquery.com/animate/。 'hide','toggle','fast'等实际上是常量,它们根本就不是这样声明的。

答案 6 :(得分:0)

前缀用于命名空间符号。例如。由于常量是在全局范围内声明的,因此可以使用前缀来指定它的上下文,并避免在不同的上下文中与符号的其他用法发生冲突。

由于类常量已经存在于上下文(类)中,因此实际上不需要为它添加前缀。而不是你的例子,这可能更有意义:

class Input {
  const STRING = 'string';
  const INTEGER = 'integer';
  const FLOAT = 'float';
}

那就是说,我发现常量(类或全局)通常不是我在PHP中使用的东西。通常可以使用更具体的方法名替换常量,这通常使代码更易于维护。例如,而不是像这样的东西:

$foo->addParameter("foo", Input::STRING);

你可以这样做:

$foo->addStringParameter("foo");

更容易阅读,它更容易编写。