PHP 全局常量是一个好的现代开发实践吗?

我正在开发一个具有相当大的PHP代码库的新项目。该应用程序使用相当多的PHP常量( ),特别是对于数据库连接参数之类的东西。这些常量都在一个配置文件中定义,该文件基本上由应用程序中的每个类直接定义。define('FOO', 'bar')require_once()

几年前,这本来是完全有道理的,但从那时起,我就遇到了单元测试错误,类之间的这种紧密耦合真的困扰着我。这些常量闻起来像全局变量,它们在整个应用程序代码中直接引用。

这仍然是一个好主意吗?将这些值复制到一个对象中并使用此对象(即Bean - 在那里,我说过)通过依赖注入将它们传达给与数据库交互的类是否合理?通过这样做,我是否击败了PHP常量(比如速度或其他)的任何好处?

我考虑的另一种方法是创建一个单独的配置PHP脚本进行测试。我仍然需要找到一种方法来让受测类使用沙盒配置脚本而不是全局配置脚本。这仍然感觉很脆弱,但可能需要对整个应用程序进行较少的直接修改。


答案 1

在我看来,常量应该只在两种情况下使用:

  • 实际常量值(即永远不会改变的事物)。SECONDS_PER_HOUR
  • 与操作系统相关的值,只要应用程序可以在任何可能的情况下透明地使用该常量。

即便如此,我还是会重新考虑类常数是否更合适,以免污染常数空间。

在你的情况下,我会说常量不是一个好的解决方案,因为你会希望根据它们的使用位置提供替代值。


答案 2

这些常量闻起来像全局变量,它们被直接引用[...]。将这些值复制到对象中并通过依赖关系注入[...]传达它们是否合理?

绝对!我会更进一步说,甚至应该避免类常量。因为它们是公共的,所以它们公开了内部结构,并且它们是API,因此您无法轻松更改它们,而不会冒着由于紧密耦合而破坏现有应用程序的风险。配置对象更有意义(只是不要让它成为单例)。

另请参阅:


推荐