Yii2:配置参数 vs const/define

3

何时使用什么?

我可以像Yii2指南:常量中推荐的那样,在index.php入口脚本文件中定义常量。或者我可以使用配置中的params,这在YII2指南:params中有解释。这两种方法都是针对应用程序而不是全局的。

目前,如果我想组合值,似乎params会稍微不太方便:

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

此外,与常量相比,访问需要更多的代码(Yii::$app->params['something'])。那么我应该在什么情况下使用什么呢?
小更新:在PHP 7中,define()也支持数组,因此整个params结构可以配置为常量。这可能得到IDE更好的支持。

1
我无法记住任何关于此的具体建议。我个人更喜欢params。常量的优点:编写的代码更少,IDE自动完成支持。 - arogachev
1
你可以使用常量来存储基本值,如数字、字符串、布尔值等。对于复杂数据,你需要选择参数(因为无法将数组和对象存储在常量中),并且通常需要将数据组织成逻辑分组。 - raina77ow
1
此外,当您使用一些部署工具时,可以为不同的部署环境设置不同的值。常量应该在您只有相同值的每个环境中使用。 - Artsiom Tymchanka
如果您需要在任何地方使用值,请使用Yii::$app->params。但是,如果您只需要使用一次该值,则建议使用常量。但是,请注意,在Yii::$app->params中,您可以使用环境变量,例如getenv('any_key'); - Ziya Vakhobov
2个回答

0

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

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

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

因此,总之,我想说的是,如果它们是真正的常量-在代码运行的任何环境中都相同-那么常量可能是可以的。如果这些值可能会根据代码运行的位置而改变,那么我的首选是将它们放在params中,并让您的构建系统从非版本控制文件中加载它们。


-1

常量的主要缺点(也是优点)是它们是...常量。一旦设置,就无法更改。这是唯一重要的事情。您应该在执行期间永远不会更改的值使用常量,并为其他所有内容使用参数。

当您开始为应用程序编写测试时,常量可能会成为真正的痛点。它将向您展示许多您认为是常量的东西实际上并不是常量。此时,参数更加灵活-您可以轻松更改它们或使用配置数组合并在配置级别进行调整。使用常量可能会使您陷入无法配置的陷阱,而无法在不修改硬编码常量的情况下在不同环境中安装应用程序。

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

这完全不相关。作为程序员,你花费的时间少于5%用于编写代码。额外的10个按键并没有任何区别。你应该始终从可读性的角度考虑它。你只编写一次代码,但会阅读数百次,因此理解和阅读代码所需的时间比编写代码所花费的时间更重要。使用已知的约定(例如Yii::$app->params)可以使你的代码更易于理解,特别是对其他程序员而言。

但如果你真的想少写一些代码,你可以随时创建一个包装函数来快速访问参数。

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

echo p('my-param');

常量的主要缺点(同时也是优点)在于它们是不变的,这就是为什么它被称为CONFIG。必须是常量...不像设置。 - Yousha Aleayoub
什么是“配置”,和“设置”有什么区别?你在使用一些自制的术语,不要期望人们理解你在说什么。另外请注意,在非常少数情况下,某些设置需要是一个常量,并且无法在同一请求中更改可能会在测试过程中出现问题。 - rob006
欢迎来到IT世界!https://wikidiff.com/configuration/setting - Yousha Aleayoub
你读过这个定义吗?它看起来不像是与 IT 相关的内容。但即使与 IT 有关,您也不能将应用程序配置视为常量,硬编码诸如 URL 等内容只会带来麻烦,并证明您没有进行适当的测试。 - rob006
配置通常只写/存储一次(如数据库内容,应用程序路径,错误处理内容...),当应用程序安装或需要初始化或设置一些基本要求时。它也很少更改。这就是为什么它存储在平面文件中的原因。与不存储基础设施相关内容并且每天都会更改的设置/首选项不同(如字体大小、颜色等...)。这就是为什么它们通常存储在数据库中的原因。您不必将它们混合在一个术语中,只是因为您不喜欢它或无法理解它们的区别! - Yousha Aleayoub
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接