我为我的 PHP 应用程序的所有常量使用一个单独的文件。
class constants
{
const USERNAME = 'abc';
/*
⋮
*/
}
假设 USERNAME
常量,值可以是 xyz
或 abc
,这取决于文件是否存在检查。如果 xyz 文件存在,USERNAME
值将是 xyz
。如何在我的常量类中执行此检查?
最佳答案
如果常量的值是可变的,那么它就不是常量,而是变量。
既然您(正确地)试图让您的应用程序内容封装起来并远离全局范围,您可能会对注册表模式感兴趣。 Registry 基本上是一个美化的数组,可以存储您放入其中的任何内容,并且可以在整个应用程序中全局访问。
一些资源:
- http://www.patternsforphp.org/index.php?title=Registry
- http://www.brandonsavage.net/the-registry-pattern-reexamined/
- http://blog.fedecarg.com/2007/10/26/registry-pattern-or-dependency-injection-container/
编辑 如果您真的很绝望并且必须重新定义常量,您可以使用
-
runkit_constant_redefine
— 重新定义一个已经定义的常量
如果您使用的是共享主机,则 Runkit 可能不可用,我认为它需要一种代码味道,但这是您基本上应该如何做的(在您的 Bootstrap 中)
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
字符串,以这种方式有效地包含类。
但我必须再说一遍:我强烈建议重构您的代码而不是使用它们。
关于基于条件的 PHP 常量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659302/