【问题标题】:Variable constants in PHPPHP中的变量常量
【发布时间】:2014-03-06 13:28:23
【问题描述】:

是否可以在 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年了,重写框架不是一个选项。

【问题讨论】:

  • 常量应该是......好吧......constant。没有“变量常量”这样的东西。换句话说,您希望常量成为变量吗?这对我来说毫无意义。为什么不直接使用变量呢?
  • 如果要更改值,请使用变量。这就是它的用途。如果你愿意,你可以在 $ALL_CAPS 中让它看起来更像全局常量
  • 对动态配置使用常量是个坏主意。使用数组。
  • 原来 PHP 允许“重新声明”一个常量一次,问题不在于这个想法是否好,也不是关于替代品的问题。该框架有成千上万行依赖于常量的代码。无法重写所有内容。

标签: php variables constants


【解决方案1】:

它是一个常数,根据定义,您不应该重新定义它。如果您最终需要重新定义代码逻辑,问题就出在您的代码逻辑上。

但如果你仍然想继续走这条路,你可以使用runkit_constant_redefine

【讨论】:

  • 配置文件不是代码逻辑。但是很高兴能够从配置文件中访问配置默认值。我会说使用变量进行配置是不好的设计,因为它们可以在运行时更改,这就是我们最初设计框架使用常量的原因。
【解决方案2】:

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

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';
}

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

【讨论】:

    【解决方案3】:

    事实证明你可以!

    首先像这样声明默认值:

    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 支持声明不区分大小写的常量这一令人难以置信的事实的副作用。

    【讨论】:

    • 这不是“重新定义”。这取决于事实,即不区分大小写的常量以 lower 大小写存储。你也会这样做echo foo,你会看到"BAR"。所以这是混淆代码阅读器的一种棘手方法。我绝对不建议这样做。此外,您不能多次执行此操作。
    • 实际上,您也可以“重新声明”小写常量——常量在内部存储为小写的事实不会暴露给开发人员。而我指定的用例只需要做一次。
    • 与重新声明无关。它声明了两个不同的常量 - 但以扭曲的方式(这可能会使阅读代码的人感到困惑)。常量不能(也不应该)按定义重新声明。
    • 不管怎样,我达到了我的目标。这里的问题是 PHP 有一个可选不区分大小写常量的概念。您声称不应使用该功能,但在这种情况下,另一种选择是重写数万行代码以使用变量进行配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2020-12-20
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多