基于条件的PHP常量声明

时间:2010-04-17 17:25:36

标签: php

我正在为PHP应用程序的所有常量使用一个单独的文件。

class constants
{
    const USERNAME = 'abc';
    /*
      ⋮
    */
}

对于让我们说USERNAME常量,根据文件存在检查,值可以是xyzabc。如果 xyz 文件存在USERNAME,则值为xyz。我如何在我的常量类中检查?

4 个答案:

答案 0 :(得分:5)

如果常量的值是可变的,那么它不是常数,而是变量。

由于您(正确地)尝试将您的应用程序封装起来并远离全局范围,因此您可能对注册表模式感兴趣。注册表基本上是一个美化的数组,它存储您投入的任何内容,并且可以在整个应用程序中全局访问。

一些资源:


编辑如果您真的绝望并且必须重新定义常量,您可以使用

如果您使用共享主机,我可能无法使用Runkit,并且我认为需要它有代码味道,但是这里你基本上是这样做的(在你的引导程序中)

if ( file_exists('xyc') ) {
    runkit_constant_redefine('Constants::USERNAME', 'xyz');
}

编辑更多选项(所有选项都不完全相同):

class Abc { const FOO = 1; const BAR = 2; }
class Xyz extends Abc { const FOO = 2; }
class_alias(file_exists('abc') ? 'Abc' : 'Xyz', 'Constants');

为此,您将当前常量类重命名为Abc并添加第二个类Xyz以扩展它并覆盖USERNAME常量(示例中的FOO)。这显然会破坏您的代码,因为您曾经执行Constants::USERNAME,因此您必须为以前的类名创建别名。 Constants将指向哪个类,由条件检查决定。这需要PHP5.3。

5.3之前的解决方案是简单地将Constants类文件保存在两个不同的名称下,例如abc_constants.php和xyz_constants.php,相应地修改后者以保持USERNAME xyz 然后include或者取决于文件检查。

或者用占位符替换USERNAME的值,而不是将类加载到变量中作为字符串。然后根据文件检查结果和eval字符串替换占位符,以这种方式有效地包括类。

但我必须再说一遍:我强烈建议您重复使用这些代码。

答案 1 :(得分:0)

这不是:PHP Readonly Properties?方法更容易吗?

在我看来,你试图滥用常量。

答案 2 :(得分:0)

http://us2.php.net/manual/en/function.define.php

if ( $file_exists )
{
    define('MYCONSTANT', 'YEAH');
}
else
{
    define('MYCONSTANT', 'NOPE');
}

答案 3 :(得分:0)

在类中没有条件常量定义。