PHP常量:优点/缺点

时间:2008-10-29 18:43:03

标签: php performance standards coding-style constants

最近我一直习惯于将整数值分配给常量,并简单地使用常量名作为识别其目的的手段。但是,在某些情况下,当需要字符串表示时,这导致需要编写类似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"

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我会说实话,我不知道当你把你的常数本身定义为字符串时,是否存在任何类型的性能“打击” - 但如果有一个根本没有,我愿意打赌它是如此之小这很难衡量。

就个人而言,如果常量的值作为文字有意义,那么只需为其赋值即可。如果常量值仅作为选项选择器(或某些其他指示值)有意义,则使用整数或任何您选择的值。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

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

class Enumeration{
  public static const One=1;
  public static const Two=2;
  public static const Three=3;
}

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