我什么时候应该使用什么?
我可以选择在index.php入口脚本文件中定义常量,就像Yii2指南:常量中推荐的那样。或者我可以在配置中使用参数 - 在 YII2 指南:params 中进行了解释。两者都是针对每个应用程序的,并不是真正全局的。
目前,在我看来,如果我想组合这样的值,参数有点不太舒服:
define('SOME_URL', 'http://some.url');
define('SOME_SPECIALIZED_URL', SOME_URL . '/specialized');
此外,与常量相比,访问需要更多代码 (
Yii::$app->params['something']
)。
那么我什么时候应该或可以使用什么?
小更新:在 PHP 7 中
define()
也支持数组,因此整个 params 结构可以配置为常量。 IDE 可能会更好地支持。
我倾向于使用 Yii 应用程序参数。主要原因是这些参数中保存的值往往会根据代码运行的环境而变化。因此,我将有一个运行的构建系统(我使用Phing)并从非版本控制文件,例如 build.properties。
因此,任何开发数据库设置、开发域设置、API 沙箱地址等都将加载到我的开发环境中,并且在实时服务器上运行构建时将使用正确的生产值。
如果您在某种 php 文件中设置这些值,那么使用版本控制进行跟踪就会出现问题,因为每次您在开发环境中构建时都会对您的 index.php 文件进行更改。有人甚至可能最终错误地进行了这些更改。
总而言之,我想说,如果它们是真正的常量——在代码运行的任何环境中都是一样的——它们也许是一个常量就可以了。如果这些值可能会发生变化,具体取决于代码运行的位置,那么我的偏好是将它们放置在 params 中,并让您的构建系统从非版本控制文件加载它们。
常量的主要缺点(同时也是优点)是它们......常量。一旦设置,就无法更改。这是这里唯一重要的事情。您应该使用常量来表示在执行过程中永远不会改变的值,并使用参数来表示其他所有内容。
当您开始为应用程序编写测试时,常量可能是真正的 PITA。它会告诉你,许多你认为恒定的事情实际上并不是恒定的。此时参数更加灵活 - 您可以轻松更改它们或使用配置数组的合并在配置级别进行调整。使用常量可能会让您陷入不可配置的应用程序的陷阱,如果不修改硬编码常量,就无法将其安装在不同的环境中。
此外,与常量相比,访问需要更多代码 (
)。Yii::$app->params['something']
这完全无关紧要。作为一名程序员,您花在实际编写代码上的时间不到 5%。额外敲击 10 次按键不会产生任何影响。您应该始终从可读性角度考虑它。您编写一次代码并阅读数百次,因此您需要阅读和理解代码的时间比编写代码所花费的时间要重要得多。使用已知的约定(
Yii::$app->params
就是其中之一)使您的代码更易于理解,尤其是对于其他程序员而言。
但是如果您确实想编写更少的代码,您始终可以创建一个包装函数来对参数进行简短访问。
function p($name) {
return Yii::$app->params[$name];
}
echo p('my-param');