19

首先:我试图用谷歌搜索它,但我大多只找到关于如何在常量和其他不相关信息中定义数组的讨论。

我有一个关于使我的代码更具可读性(和漂亮)的解决方案的问题,我刚刚想到。基本上,我有大多数函数返回一个状态码,表示成功,或者,如果出现问题,一个错误码。为此,我创建了一个名为“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")方法,因为它看起来不那么漂亮,而且在我的德语键盘上书写很麻烦 :))

4

3 回答 3

29

在 Java 和其他语言中,这是命名常量以避免命名冲突的常用方法。见这里

我实现这样一个类的方式是这样的”

// 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");
    }
}
于 2013-05-31T05:55:10.547 回答
1

这具有命名空间和分组常量的优点。您可以对该类使用反射来迭代定义的常量,例如,这允许您验证一个值是否是某个常量组的值(启用穷人的常量类型提示)。

缺点是您有点滥用课程(尽管只是轻微的)。纯粹主义者可能不喜欢这样。不在同一个类中使用的常量应该是全局常量;您甚至可以将它们命名为\StatusCodes\SUCCESSPHP 5.3+ 中的名称。

选择权在你,真的。

于 2013-05-31T06:07:45.750 回答
0

创建一个静态类将解决您的问题并避免创建多个实例StatusCode

如果您认为您的应用程序可以有多个 StatusCode 类但 StatusCode 仍然是静态的,则可以使用命名空间。

如果你想使用单例模式,这也可以

选择是你的!

于 2013-05-31T06:25:29.233 回答