gpt4 book ai didi

基于条件的 PHP 常量声明

转载 作者:可可西里 更新时间:2023-11-01 13:23:37 25 4
gpt4 key购买 nike

我为我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com