Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的可变常量_Php_Variables_Constants - Fatal编程技术网

PHP中的可变常量

PHP中的可变常量,php,variables,constants,Php,Variables,Constants,可以在PHP中更改常量的值吗?我们希望项目的配置文件具有合理的默认值 目前我们正在做: config.php: define('WEB_ROOT', '/home/user/public_html'); config.default.php: defined('WEB_ROOT') || define('WEB_ROOT', '/home/user/public_html'); 问题是,在某些情况下,您可能希望从“config.php”内部访问某些配置默认值。例如: config.php d

可以在PHP中更改常量的值吗?我们希望项目的配置文件具有合理的默认值

目前我们正在做:

config.php:

define('WEB_ROOT', '/home/user/public_html');
config.default.php:

defined('WEB_ROOT') || define('WEB_ROOT', '/home/user/public_html');
问题是,在某些情况下,您可能希望从“config.php”内部访问某些配置默认值。例如:

config.php

define('USER_FILE_ROOT', WEB_ROOT.'/files');
带有常量的配置方案已经使用了5年,重写框架不是一个选项。

事实证明你可以

首先声明如下默认值:

define('WEB_ROOT', '/var/www', TRUE);
然后包括配置文件:

define('WEB_ROOT', '/home/user/public_html');
此代码运行良好:

define('FOO', 'BAR', TRUE);
echo FOO; // outputs BAR
define('FOO', 'FOOBAR');
echo FOO; // outputs FOOBAR

这是PHP支持声明不区分大小写的常量这一令人难以置信的事实的副作用。

它是一个常量,根据定义,您不应该能够重新定义它。如果最终需要重新定义代码逻辑,那么问题就在于代码逻辑


但是,如果您仍然想继续使用该路径,您可以使用

我通过使用以下模式解决了默认常量的问题:

config.default.php

class Config_Defaults{
    const WEB_ROOT = '/home/user/public_html';
}
config.myenvironment.php

class Config extends Config_Defaults {
    const WEB_ROOT = '/var/www';
}

Imho,使用Config类对全局常量进行分组总是一个好主意。扩展类是拥有一些合理默认值的干净方法。

常量应该是。。。嗯。没有“可变常数”这样的东西。换句话说,你想要一个常数成为一个变量?那对我来说毫无意义。为什么不直接使用变量呢?如果您想更改值,请使用变量。这就是它的目的。如果您希望在动态配置中使用常量是个坏主意,那么可以使用$ALL_CAPS使其看起来更像全局常量。事实证明,PHP允许一次“重新定义”常量,问题不在于这个想法是否好,也不在于替代方案。该框架有成千上万行依赖于常量的代码。无法重写所有内容。这不是“重新定义”。这取决于一个事实,即不区分大小写的常量存储在小写中。因此,您将执行
echo foo
您将看到
“BAR”
。因此,这是一种让代码读取器感到困惑的棘手方法。我绝对不建议做这种事。此外,这件事你不能重复一次。事实上,你也可以“重新声明”小写常量——事实上,常量是以小写形式存储在内部的,这一点不会向开发人员公开。我指定的用例只需要执行一次,与重新声明无关。它声明了两个不同的常量——但方式扭曲(这可能会让读代码的人感到困惑)。常量不能(也不应该)通过定义重新声明。不管你怎么看,我实现了我的目标。这里的错误在于PHP有一个可选的不区分大小写的常量的概念。您声称不应使用该功能,但在本例中,另一种选择是重写数万行代码以使用变量进行配置。配置文件不是代码逻辑。但是,能够从配置文件中访问配置默认值是很好的。我认为使用变量进行配置是一种糟糕的设计,因为它们可以在运行时更改,这也是我们最初设计框架使用常量的原因。