PHP常量:优缺点

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"

我有些困惑 - 你是不是在第二种情况下想把0、1、2改成“admin”、“user”和“guest”? - Greg
是的,我肯定做到了!:-)谢谢你发现了这个问题,现在应该已经更新了。 - Wilco
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数组设置为static

4
我要诚实地说,我不知道当您将常量原生定义为字符串时是否会有任何性能“损失” - 但如果有任何损失,我愿意打赌它非常小,很难测量。
个人而言,如果常量的值作为文字具有意义,则只需分配该值。如果常量的值仅作为选项选择器(或其他值的指示符),则使用整数或您认为合适的任何内容。

比较字符串比比较整数更耗费资源。 - Paweł Hajdan
2
但是进行10个字符串比较和10个整数比较之间的差异非常微小,如果使用字符串可以使编码更容易,那么最好使用字符串。 - Greg
2
用整数代替字符串只是为了节省每个请求的毫秒级时间,这种做法实在是充满了过早优化的味道。 - Peter Bailey

1

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

当然,如果你需要最后一点性能,可以使用整数常量。但是只有在使用分析器验证字符串比较是瓶颈之后才这样做。无论如何,在大多数应用程序中,还有许多更昂贵的事情,比如数据库访问等。


0

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


这也是我会做的,但是 OP 似乎来自更严格的背景...也许是前 C++ 或 Java 程序员 :p - Greg
我目前是一名C++开发人员,甚至在一般情况下也使用字符串。 - Jasper Bekkers

-3
在你所写的示例中,你可以放弃所有的方法并将类设置为静态的,这样你就创建了一个枚举器。像这样:
class Enumeration{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

另一种使用常量的方便方法是将它们用作应用程序配置。从性能上来说,它们比解析 XML 文件进行配置要快得多。

1
Nikola,php不允许常量使用“public static”关键字。 你的代码会产生语法错误。 - user254518

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接