php 5.6+ 推荐用命名空间常量+显式导入管理跨模块共用变量,集中定义于如app\shared\constants中,通过use const导入使用,配合类常量做语义分组与访问控制,并在ci/cd中加入硬编码扫描兜底。

直接用命名空间常量 + 显式导入,是 PHP 5.6+ 管理跨模块共用变量最轻量、最可靠的方式。它不依赖配置中心或外部文件,也不引入运行时解析开销,同时天然规避硬编码。
统一定义在专用命名空间中
把所有跨模块共用的值(如状态码、重试阈值、API 路径)集中定义在一个明确用途的命名空间里,比如 App\Shared\Constants:
- 避免散落在各处的
define()或零散const,杜绝“改一处漏十处” - 命名空间本身即文档:看到
\App\Shared\Constants\ORDER_PENDING就知道这是订单状态,不是随便一个数字 - 不允许在业务逻辑文件里直接写
1或"pending"—— 所有字面量必须来自这个命名空间
使用 use const 显式导入所需常量
在用到这些值的类或脚本中,不拼接完整路径,而是用 use const 明确声明依赖:
-
use const App\Shared\Constants\MAX_RETRY;→ 后续可直接写MAX_RETRY - 比
\App\Shared\Constants\MAX_RETRY更简洁,比全局常量更安全 - IDE 可自动补全、跳转和重构;代码审查时一眼看出该模块依赖哪些共享配置
- 禁止使用
use App\Shared\Constants;全量导入 —— 防止无意中污染当前作用域
配合类常量做语义分组与访问控制
对需要封装逻辑或限制访问的场景,用 PHP 7.1+ 的带可见性的类常量补充:
- 比如认证模块的密钥前缀:
private const KEY_PREFIX = 'auth_';,仅内部方法可用 - 协议版本号:
public const VERSION = 'v2';,供外部调用但不可修改 - 把“值”和“行为”分开:命名空间常量管数据,类常量管上下文与权限
CI/CD 中加入硬编码扫描作为卡点
光靠约定不够,需工具兜底:
- 在 Git Hook 或 CI 流程中运行静态分析(如 PHPStan 自定义规则),拦截未通过命名空间引用的数字/字符串字面量
- 重点检查:SQL 查询中的字符串、HTTP 请求头值、状态判断分支里的数字
- 报错示例:
Found magic string "active" in UserService.php:42 —— use App\Shared\Constants\STATUS_ACTIVE instead











