Yii2:配置参数与常量/定义


Yii2: Config params vs. const/define

我什么时候应该使用什么?

我可以选择在索引.php入口脚本文件中定义常量,就像 Yii2 指南中推荐的那样:常量。或者我可以在配置中使用参数 - 在 YII2 指南中解释:参数。两者都是针对每个应用程序,而不是真正的全局。

目前,在我看来,如果我想组合这样的值,参数会不太舒服:

define('SOME_URL',            'http://some.url');
define('SOME_SPECIALIZED_URL', SOME_URL . '/specialized');

此外,与常量相比,访问是更多的代码(Yii::$app->params['something'])。

那么我什么时候应该或可以使用什么?

小更新:在 PHP 7 中,define()也支持数组,因此整个参数结构可以配置为常量。可能由 IDE 更好地支持。

我倾向于使用 Yii 应用程序参数。造成这种情况的主要原因是,这些参数中保存的值往往会根据运行代码的环境而变化。因此,我将拥有一个运行(我使用Phing)并从非版本控制文件(如build.properties)中提取设置的构建系统。

因此,任何开发数据库设置、开发域设置、api 沙箱地址等都将加载到我的开发环境中,并且在实时服务器上运行构建时将使用正确的生产值。

如果您在某种 php 文件中设置这些值,那么使用版本控制进行跟踪就会出现问题,因为每次在开发环境中构建时,都会对 index.php 文件进行更改。有人甚至可能最终错误地提交这些更改。

所以总而言之,我会说如果它们是真正的常量 - 在代码运行的任何环境中都一样 - 它们可能是一个常量就可以了。如果这些值可能会更改,具体取决于代码的运行位置,那么我的偏好是将它们放在参数中,并让您的构建系统从非版本控制的文件加载它们。

常量的主要缺点(同时也是优点)是它们...不断。设置后,您将无法更改它。这是这里唯一应该重要的事情。您应该对在执行期间不应更改的值使用常量,对其他所有值使用参数。

当您

开始为应用编写测试时,常量可能是真正的 PITA。它将向你展示许多你认为恒定的东西并不是真正的恒定。此时参数更加灵活 - 您可以使用配置数组的合并轻松地更改它们或在配置级别进行调整。使用常量可能会使您陷入无法配置的应用程序陷阱,如果不修改硬编码常量,就无法将该应用程序安装在不同的环境中。

此外,与常量相比,访问是更多的代码(Yii::$app->params['something'])。

这完全无关紧要。作为一名程序员,你花在实际编写代码上的时间不到5%。额外的 10 次击键不会有任何区别。您应该始终从可读性的角度考虑它。你写一次代码,读了几百遍,所以你需要多少时间来阅读和理解代码比你花在编写代码上的时间重要得多。使用已知的约定(Yii::$app->params就是其中之一)使您的代码更容易理解,特别是对于其他程序员。

但是,如果您真的想编写更少的代码,则始终可以创建一个包装器函数来短暂访问参数。

function p($name) {
    return Yii::$app->params[$name];
}
echo p('my-param');