
php 内置了 `log_debug` 等系统日志常量(值为整数,如 `7`),直接使用 `define()` 重定义会触发“constant already defined”警告,且函数默认参数中引用该常量将实际传入其整数值(如 `7`),导致输出异常。
在 PHP 中,LOG_DEBUG、LOG_ERROR 等并非用户自定义常量,而是 PHP 核心预定义的整型常量(位于 syslog 扩展中),用于系统日志级别控制。其定义如下(可通过 php -r "var_dump(LOG_DEBUG);" 验证):
int(7) // LOG_DEBUG int(3) // LOG_ERROR
因此,当您执行:
define('LOG_DEBUG', 'DEBUG'); // ❌ 尝试覆盖内置常量PHP 会发出 Notice: Constant LOG_DEBUG already defined 警告(即使 error_reporting 包含 E_NOTICE),并且后续对 LOG_DEBUG 的引用(如函数默认参数 $level = LOG_DEBUG)实际取的是内置整数值 7,而非您期望的字符串 'DEBUG' —— 这正是输出中出现 [2022-02-11 22:00:33 7] 的根本原因。
✅ 正确做法:避免复用 PHP 内置常量名。推荐以下任一方案:
立即学习“PHP免费学习笔记(深入)”;
方案 1:使用命名空间前缀(推荐)
方案 2:使用类常量(更现代、可维护)
方案 3:使用 defined() 安全检查(仅适用于兼容旧代码场景)
? 关键提醒:
- 永远不要假设常量名是“安全可用”的——务必查阅 PHP 预定义常量文档 和扩展手册(如 syslog 常量列表);
- 在团队项目或框架中,优先采用类常量或配置数组,提升类型安全与 IDE 支持;
- 开发环境应开启 error_reporting(E_ALL),确保此类 Notice 不被忽略,及早暴露潜在问题。











