我正在为PHP应用程序的所有常量使用一个单独的文件。
class constants
{
const USERNAME = 'abc';
/*
⋮
*/
}
对于让我们说USERNAME
常量,根据文件存在检查,值可以是xyz
或abc
。如果 xyz 文件存在USERNAME
,则值为xyz
。我如何在我的常量类中检查?
答案 0 :(得分:5)
如果常量的值是可变的,那么它不是常数,而是变量。
由于您(正确地)尝试将您的应用程序封装起来并远离全局范围,因此您可能对注册表模式感兴趣。注册表基本上是一个美化的数组,它存储您投入的任何内容,并且可以在整个应用程序中全局访问。
一些资源:
编辑如果您真的绝望并且必须重新定义常量,您可以使用
runkit_constant_redefine
- 重新定义已定义的常量如果您使用共享主机,我可能无法使用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)
在类中没有条件常量定义。