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

2024-02-19

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

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

这仍然是个好主意吗?将这些值复制到一个对象中并使用该对象(即一个 Bean - 我说过)通过依赖项注入将它们传递给与数据库交互的类是否合理?我这样做是否会破坏 PHP 常量的任何好处(例如速度或其他)?

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


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

  • 实际恒定值(即永远不会改变的东西,SECONDS_PER_HOUR).
  • 依赖于操作系统的值,只要应用程序在任何可能的情况下都可以透明地使用该常量。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 全局常量是一种良好的现代开发实践吗? 的相关文章

随机推荐

  • 如何在 NHibernate 中对两个表进行并集?

    我需要使用 NHibernate 和 HQL 来合并两个表 我在网上找到的帮助很少 我想知道这是否可能 如果可能的话如何 找到了我的答案 http www hibernate org 117 html A21 http www hibern
  • 资源规格和代理跟踪

    我需要解决一个问题 但由于缺乏 Java 培训 我无法解决该问题 要编写什么代码来跟踪获取资源的代理 让我更好地解释一下 我有一系列房间 每个进入该结构的特工都会占用一个房间 并在整个住宿期间保留该房间 我想实时查看哪些房间被占用以及由哪个
  • Int32 的 GetHashCode() 是如何实现的?

    我到处找遍了 但什么也没找到 有人能解释一下吗 根据反射镜 public override int GetHashCode return this 有道理 不是吗
  • 工厂方法 (1) vs 工厂 (2) vs Builder (3) 模式

    用途 1 2 3 的用例是什么 使用它有什么优点和缺点 他们之间有什么区别 工厂方法模式 这种模式与工厂模式非常相似 客户端也从类层次结构中向工厂请求特定类型的对象 但是工厂模式的 Create 方法工厂类将特定对象的创建委托给派生类并返回
  • 如何从管道 (jenkinsfile) 中使用 Jenkins Copy Artifacts 插件?

    我试图找到一个在 Jenkins 管道 工作流程 中使用 Jenkins Copy Artifacts 插件的示例 谁能指出使用它的示例 Groovy 代码吗 通过声明式 Jenkinsfile 您可以使用以下管道 pipeline age
  • 超时已过。操作完成前超时时间已过或服务器未响应

    运行 ssis 包时 我在 ADO net 源中调用 sp 但出现此错误 超时已过 操作完成之前超时时间已过 或者服务器没有响应 我已将命令超时设置为 0 无限时间 但仍然收到错误 sp 在 sql server 中工作正常 大约需要 31
  • Android Studio 签名的 APK 未安装

    我在 Android Studio 中 在 构建 gt 生成签名的 APK 下签署 APK 并使用向导 一切似乎都正常 并生成了一个 apk 文件 当我将此文件复制到我的设备 Nexus 7 或 Moto X 时 它不会安装 我收到 安装失
  • 单击电子邮件链接时出现不受支持的操作错误

    我已在 xml 中提供了指向 TextView 的电子邮件链接 但当我单击 TextView 时 它显示不支持的操作错误 如何将活动链接放在文本视图中的电子邮件上 这是我的 string xml 文件的代码
  • 如何禁用 UIScrollView 的水平滚动?

    我有一个UIView就像iPhone的跳板一样 我已经使用创建它UIScrollView and UIButtons 我想禁用所述滚动视图上的水平滚动 我只想要垂直滚动 我该如何实现这个目标 你必须设置contentSize的财产UIScr
  • Akka/Java getContext().become 带参数?

    在 Akka Scala 中 可以将参数传递给自定义接收函数 因此可以通过 params 传递整个 actor 状态 而无需使用可变变量 context become myCustomReceive param1 param2 但在 Jav
  • 为什么 strcmp 比我的函数快得多?

    我写了一个函数 Str Compare 这基本上是一个strcmp以另一种方式重写 在比较两个函数时 在循环中重复 500 000 000 次 strcmp执行速度太快 大约x750快几倍 这段代码是在 C 库中编译的 Os参数有效 int
  • 为什么输入错误值后输出是三行消息而不是一行?

    输入的代码是 import java io IOException public class A public void fn throws IOException char ch do System out println Press C
  • 由于 MIME 类型不匹配,IE9 脚本响应被阻止

    我使用以下代码片段将 google fusion 表中的数据加载为 json var fileref document createElement script fileref setAttribute type text javascri
  • Visual Studio 2010 中的文本覆盖

    这里真的很愚蠢的问题 在 Visual Studio 2010 中 文本光标已从闪烁的线更改为字符周围闪烁的灰色框 当我输入时会覆盖前面的文本 我不知道如何去掉这个 这就像当您在 Microsoft Word 中按插入键并打开覆盖模式时会发
  • 证书验证失败:证书已过期 (_ssl.c:1108)

    当尝试运行我的 Discord 机器人时 我收到此错误 raise ClientConnectorCertificateError aiohttp client exceptions ClientConnectorCertificateEr
  • 如何在 Windows 启动时启动 python 文件?

    我有一个 python 文件并且正在运行该文件 如果 Windows 关闭并再次启动 我如何在每次 Windows 启动时运行该文件 根据脚本正在执行的操作 您可以 将其打包成服务 然后安装该服务 将其添加到 Windows 注册表 HKC
  • 我想在启动画面中播放lottie动画React Native

    在 React Native 中 在应用程序启动之前 我们可以看到白屏 我想在单击应用程序图标时立即加载启动屏幕 我想避免白色背景 Using 反应本机启动画面 https github com crazycodeboy react nat
  • 使用远程 couchbase 和 AWS ec2 时超时

    出于开发目的 我想将本地计算机连接到安装在远程 ec2 上的 couchbase 我成功建立连接 但当我尝试访问数据时出现超时 我搜索了问题并发现here https stackoverflow com questions 12117746
  • Java 的 varargs 性能

    编码 我来检查 Java 的 vararg 性能 我编写以下测试代码 public class T public static void main String args int n 100000000 String s1 new Stri
  • PHP 全局常量是一种良好的现代开发实践吗?

    我正在开发一个具有相当大的 PHP 代码库的新项目 该应用程序使用了相当多的 PHP 常量 define FOO bar 特别是对于数据库连接参数之类的事情 这些常量都定义在一个配置文件中 该文件是require once 基本上应用程序中