get_defined_constants() 是 PHP 中用于获取所有已定义常量的内置函数。它返回一个关联数组,其中键为常量名,值为常量值。这在调试、反射或分析运行环境时非常有用。然而,在不同版本的 PHP 中,该函数的行为可能会表现出一些差异,主要体现在以下几个方面:
随着 PHP 的发展,不断有新的核心常量被引入,尤其是在新增扩展或对现有模块进行重构后。例如,在 PHP 7.x 和 PHP 8.x 中,错误处理机制的变化导致引入了大量新的 E_* 错误级别常量。
print_r(array_keys(get_defined_constants()));
在 PHP 5.6 中,你可能看不到 E_ERROR | E_RECOVERABLE_ERROR 这样的合并常量,但到了 PHP 7 以后,就会多出很多这类组合值的定义。
从 PHP 5.3 起,get_defined_constants() 开始支持一个布尔参数 $categorize,当设为 true 时,会以扩展名分类常量。
print_r(get_defined_constants(true));
不同 PHP 版本中,不同扩展模块的分类名可能会变。例如:
PHP 7.2 中的数组可能包含 Core, pcre, SPL, date, libxml, openssl, curl 等。
PHP 8.0 后引入的如 ffi, sodium, fiber,也会新增到输出结果中。
某些常量是否出现在 get_defined_constants() 的结果中,可能受到配置文件(如 php.ini)或编译选项的影响。例如是否启用了 Zend OPcache,是否加载了特定扩展模块等。
define('MY_APP_VERSION', '1.0.0');
print_r(get_defined_constants());
这个输出在开发服务器与生产服务器之间常常不一致,因为它们启用的扩展和配置参数可能不同。
PHP 8 引入了 JIT、match 表达式、属性(attributes)等语法特性,也相应带来了新常量。运行 get_defined_constants() 会发现如 PHP_FD_SETSIZE、T_MATCH、T_ATTRIBUTE 等常量的出现。
这些新常量在旧版本中完全不存在,因此如果你在写兼容性强的代码时依赖这些常量,一定要使用 defined() 函数加以判断。
极少数情况下,某些已定义常量在新版本中会被更改或废弃。虽然 PHP 团队通常会确保向后兼容,但也不排除在重大版本升级时进行调整。例如一些与底层系统交互的扩展,因依赖 C 库的更新,可能会改变默认值或删除某些不再支持的常量。