首先:我试图谷歌,但我大多只发现有关如何在常量和其他无关信息中定义数组的讨论。
我有一个关于使我的代码更具可读性(和漂亮)的解决方案的问题。基本上我有大多数函数返回一个状态代码,表示成功,或者,如果出现问题,返回错误代码。为此,我创建了一个名为“StatusCode”的类,它只包含常量,如下所示:
<?php
class StatusCode {
const success = 0;
const badArgument = -1;
const badQuery = -2;
const outOfMana = -3; //Really just for demonstration purposes
...
}
目的是让魔法数字从我的代码中消失,并清楚地说明出了什么问题,而不必在某处寻找解释:
if (mana > 10) {
//Do some magic
return StatusCode::success;
}
else {
//Oh god this is not good!
return StatusCode::outOfMana;
}
它还应该消除意外使用重复错误代码的可能性。 我很确定这会给我的应用程序增加一些小的开销,但是让我的代码更易于理解。是否有一些惊天动地的理由不这样做?也许更好的办法呢?
(我已经避免使用define(CONSTANT, "value")
方法,因为它看起来不那么漂亮,而且在我的德语键盘上写字很麻烦:))
答案 0 :(得分:19)
在Java和其他语言中,这是命名空间常量的常用方法,以避免命名冲突。见here;
我实现这样一个类的方式就像这样“
// make this final so no one can extend it
final class Errors{
const SUCCESS = 0;
const BAD_ARGUMENT = -1;
const BAD_QUERY = -2;
const OUT_OF_MANA = -3;
// make this private so noone can make one
private function __construct(){
// throw an exception if someone can get in here (I'm paranoid)
throw new Exception("Can't get an instance of Errors");
}
}
答案 1 :(得分:1)
这具有命名空间和分组常量的优点。您可以使用该类的反射来迭代定义的常量,例如,这允许您验证某个值是某个常量组的值(启用穷人的常量类型提示)。
缺点是你有点滥用课程(虽然只是略微)。纯粹主义者可能不喜欢这样。未在同一个类中使用的常量应该是全局常量;您甚至可以将它们命名为PHP 5.3 +中的\StatusCodes\SUCCESS
。
选择是你的,真的。
答案 2 :(得分:1)
创建静态类可以解决您的问题并避免创建StatusCode
的多个实例
如果您认为您的应用程序可以有多个StatusCode类但StatusCode仍然是静态的,则可以使用命名空间。
如果您想使用单件模式,这也可以使用
选择是你的!