PHP常量可以'每个HTTP请求更改的值?

时间:2018-05-09 10:50:10

标签: php constants

我想从设计POV中了解是否不鼓励更改每个HTTP请求的常量值或完全正常。

我有一些在PHP脚本开头定义的常量,它们用于确定特定的上下文(当时用户尝试做什么)。在脚本的整个生命周期中,常量永远不会更改,因此它们符合常量规则并且运行良好。但是,这些常量的值取决于用户的行为。我想知道在PHP中这是否令人沮丧或完全可以接受。

<?php
// This function is only run once per HTTP request at the start
function new_paper() {
    define('NEW_PAPER', 1);
    define('NEW_VERSION', 0);
}

// This function is also only run once per HTTP request at the start
function new_paper_version() {
    define('NEW_PAPER', 0);
    define('NEW_VERSION', 1);
}

// This function is subsequently called by both functions above
function a_handler_of_sorts() {

    if (NEW_PAPER) {
        // Do something if it's a new paper
    }
    elseif (NEW_VERSION) {
        // Do something if it's a new version
    }
    else {

    }
}

在任何情况下,new_paper()new_paper_version()都不会在同一个HTTP请求中运行。

2 个答案:

答案 0 :(得分:1)

典型的用例如下:

define('DEBUG', !empty($_GET['debug']));

if (DEBUG) echo 'some debugging statement';

显然,不要根据查询参数执行此 ,尤其是不在生产中,但是你明白了。

所以,是的,根据请求设置常量值很好。在您的特定情况下这是否是最好的事情是值得怀疑的,我不知道。我真的保留它为“meta”值,如调试标志,而不是基本上是函数参数的值,业务逻辑的输入。 谨慎行事。

“常量值”会影响每个脚本独立于请求的工作方式,例如配置文件或环境变量,例如:包含数据库访问凭证等。

答案 1 :(得分:1)

常量应该在请求期间发生变化,但正如你所说的那样,你不这样做我觉得你没关系。

它们表示固定的东西,例如允许多少数据库连接,应用程序的名称等。如果您尝试使用它们来存储应用程序的状态,那么您可以考虑执行以下操作:

<?php
define('STATE_PAPER', 0);
define('STATE_VERSION', 1);
define('STATE_INVALID', 2);

$applicationState = null;

if (someCheckForPaper() === true) {
    $applicationState = NEW_PAPER;
} else if (someCheckForVersion() === true) {
    $applicationState = NEW_VERSION;
} else {
    $applicationState = STATE_INVALID;
}

// Save $applicationState somewhere... maybe session?

// Somewhere else
if ($applicationState === STATE_PAPER) {
    ...
}