基于条件的 PHP 常量声明

标签 php

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

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

假设 USERNAME 常量,值可以是 xyzabc,这取决于文件是否存在检查。如果 xyz 文件存在,USERNAME 值将是 xyz。如何在我的常量类中执行此检查?

最佳答案

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

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

一些资源:


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

如果您使用的是共享主机,则 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/

相关文章:

php - mysql GROUP BY 遇到问题

php - 如何查找从随机表中选择的随机行

php - 如何将 PHPUnit 与 Zend Framework 一起使用?

PHP Carbon 检查所选日期是否大于其他日期

php - 不允许学说 2.0 Orx

PHP:相互使用的类

php - 如何同时使用xampp和mysql服务器

php - 通过 PHP 从 Internet 流式传输文件很慢

php - MySQL INSERT ....ON DUPLICATE UPDATE - 添加一个到自动增量

php - Laravel 更新数组语法