8

最近,我养成了将整数值分配给常量的习惯,并简单地使用常量名称作为识别其用途的一种方式。但是,在某些情况下,这导致需要在需要字符串表示时编写类似 typeToString($const) 的函数。显然,这是低效且不必要的,但只是偶尔出现的问题。

所以我的问题是,我还应该考虑其他权衡吗?哪种情况被认为更清洁/更符合标准?此外,在大多数情况下,性能差异是否可以忽略不计?

案例1:(当不需要字符串版本时更快?)

class Foo {
    const USER_TYPE_ADMIN = 0;
    const USER_TYPE_USER = 1;
    const USER_TYPE_GUEST = 2;

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
        $this->userType = $type;
    }

    public function typeToString() {
        switch($this->userType) {
            case self::USER_TYPE_ADMIN:
                return 'admin';
                break;

            case self::USER_TYPE_USER:
                return 'user';
                break;

            case self::USER_TYPE_GUEST:
                return 'guest';
                break;

            default:
                return 'unknown';
                break;
        }
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->typeToString();
// Displays "guest"

案例2:(需要字符串版本时更快/更容易)

class Foo {
    const USER_TYPE_ADMIN = 'admin';
    const USER_TYPE_USER = 'user';
    const USER_TYPE_GUEST = 'guest';

    public $userType = self::USER_TYPE_ADMIN;

    public function __construct($type) {
        $this->userType = $type;
    }
}

$foo = new Foo(Foo::USER_TYPE_GUEST);
echo $foo->userType();
// Displays "guest"
4

5 回答 5

8

除非您存储大量它们,否则性能差异将可以忽略不计。我会toString()更简洁地编写该方法:

$strings = array
(
    self::USER_TYPE_ADMIN => 'admin',
    self::USER_TYPE_USER => 'user',
);

if (!isset($strings[$type]))
    return 'unknown';

return $strings[$type];

此外,您可以将$strings数组设为 a static

于 2008-10-29T18:49:55.270 回答
4

老实说,当您将常量定义为字符串时,我不知道是否有任何类型的性能“命中” - 但如果有的话,我愿意打赌它是如此之小难以测量。

就个人而言,如果常量的值作为文字有意义,则只需为其分配该值。如果常量的值仅作为选项选择器(或其他值指示)有意义,则使用整数或您选择的任何合适的值。

于 2008-10-29T18:48:07.130 回答
1

我认为在这种情况下字符串常量是最好的选择。代码看起来更好。

当然,如果您需要最后一点性能,请使用整数常量。但只有在您使用分析器验证字符串比较是瓶颈之后。无论如何,在大多数应用程序中都有很多更昂贵的东西,比如数据库访问等。

于 2008-10-29T18:48:38.500 回答
0

如果我需要打印它们,我通常只使用字符串而不是使用 const 整数。所以我会做类似的事情$foo = new Foo('guest');。我仍然可以验证构造函数中的输入,并且可以在需要时对其进行标记。

于 2008-10-29T18:45:19.023 回答
-3

在您编写的示例中,您可以删除所有方法并使类成为静态类,您将创建自己的枚举器。像这样:

类枚举{
  公共静态常量一=1;
  公共静态常量二=2;
  公共静态常量三=3;
}

使用常量的另一种方便方法是将它们用作应用程序配置。它们在性能方面比解析 xml 文件进行配置要快得多。

于 2008-10-29T23:08:02.957 回答