基于条件的PHP常量声明

基于条件的PHP常量声明,php,Php,我对PHP应用程序的所有常量使用一个单独的文件 class constants { const USERNAME = 'abc'; /* ⋮ */ } 对于USERNAME常量,根据文件存在检查,值可以是xyz或abc。如果xyz文件存在,则用户名值将为xyz。如何在常量类中执行此检查?这不是更简单的方法吗 在我看来,你似乎试图误用常数。 在类中不可能有条件常量定义。如果常量的值是可变的,那么它不是常量,而是变量 由于您(正确地)试图将应用程序内容封装起来并

我对PHP应用程序的所有常量使用一个单独的文件

class constants
{
    const USERNAME = 'abc';
    /*
      ⋮
    */
}
对于
USERNAME
常量,根据文件存在检查,值可以是
xyz
abc
。如果xyz文件存在,则
用户名
值将为
xyz
。如何在常量类中执行此检查?

这不是更简单的方法吗

在我看来,你似乎试图误用常数。


在类中不可能有条件常量定义。

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

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

class constants
{
    const USERNAME = 'abc';
    /*
      ⋮
    */
}
一些资源:


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

  • -重新定义已定义的常量

RunKIT可能不可用,如果你在共享主机上,我认为需要一个代码嗅觉,但是这里是你基本上是如何做的(在引导中)


编辑更多选项(所有选项也不完全漂亮):

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

5.3版本之前的解决方案是简单地将常量类文件保存在两个不同的名称下,例如abc_Constants.php和xyz_Constants.php,相应地修改后者以保留用户名xyz,然后
包含
,或者取决于文件检查

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


但我必须再说一遍:我强烈建议您不要使用这些工具来重构代码。

是的,我知道这一点,但我正在寻找解决这个问题的方法。不应该,因为这是他的问题的答案。@NSD不,不是。不能在类中使用define。有条件地设置常量值是错误地使用变量的常量。您可以在类方法中使用它,比如构造函数。效果相同,噪音更小。下一场争论?你还是不明白重点。OP需要类常量,而不是全局常量。在一个类中拥有常量的全部意义不是在全局范围内乱扔自定义常量。如果这是一个意义,那么它从未进入原始问题似乎很奇怪。实际上,当我设计应用程序时,一个常量应该只有一个值。在我看来,为所有常量创建一个常量文件似乎是一个简单的方法。现在,由于一些需求的变化,它可以根据文件的存在而变化。我现在不能更改常量文件,因为我还必须支持向后兼容。我明白了。那么常量类的文件的变体呢?如果只是用户名的问题,那就没问题了。否则就不能用了。或者eval函数可能会起作用。eval在这里有什么帮助?他没有说它是可变的,他说它是有条件的,这就是define函数存在的原因。@NSD OP显式表示USERNAME常量,值可以是xyz或abc。这怎么不可变呢?就像通常的情况一样,这个问题是由一个不太注意它的人编辑的。他实际上说的是,它是根据文件是否存在而有条件地定义的。由于不太可能在运行时重复创建和删除此文件,除非你只是想在一天结束时让你的老板对你的行数印象深刻,否则这太过分了。事实上,这个常量已经在我的应用程序的几个文件中使用过,根据系统中存在的文件,它的值可以是“abc”或“xyz”。我有一个解决方案,就是我可以创建两个单独的常量(用户名=“abc”;//当前代码)(USERNAME_NEW='xyz';//添加新常量)USERNAME\u NEW始终具有高优先级,因此如果定义了它,请使用它,否则转到USERNAME,但我不想通过到处放置if-else条件来创建难看的代码,只是为了常量名称检查。因此,与其创建新常量,不如更改USERNAME常量本身的值。@CM无意冒犯,但对我来说,这听起来好像已经是代码了是丑陋的。用户名是固定值,或者它不是。如果它不是使它成为常量。如果这就是它在你的代码现在,然后考虑重构它。
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');