我注意到很多(所有?)PHP常量都有一个单字母前缀,如E_NOTICE
,T_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';
}
答案 0 :(得分:6)
直到5.3 PHP仅限于一个全局命名空间。这意味着用define
声明或内置到语言中的任何常量都需要一个前缀来自行分区 - 如果愿意,可以使用便宜的命名空间。
关于常量本身:虽然E_NOTICE
比ERROR_NOTICE
更容易输入,但前者的主要缺点是不能自我记录。在全局上下文中,不仅需要按前缀对常量进行分区,这些前缀也应尽可能具有描述性。
类常量是一个稍微不同的野兽,因为你总是按类名引用它们 - 将内置分区。所以你最终会得到Account::STATUS_CONFIRMED
和Account::STATUS_BANNED
。但如果我计划有几十种状态,我会将它们放在他们自己的班级,例如AccountStatus::CONFIRMED
,AccountStatus::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_
执行两项操作:
USER_ERROR
的常量,那就可以了。在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");
更容易阅读和,它更容易编写。