当前位置: 首页> 最新文章列表> get_defined_constants() 在不同 PHP 版本下的差异

get_defined_constants() 在不同 PHP 版本下的差异

M66 2025-05-22

get_defined_constants() 是 PHP 中用于获取所有已定义常量的内置函数。它返回一个关联数组,其中键为常量名,值为常量值。这在调试、反射或分析运行环境时非常有用。然而,在不同版本的 PHP 中,该函数的行为可能会表现出一些差异,主要体现在以下几个方面:

1. 常量的数量和种类发生变化

随着 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 以后,就会多出很多这类组合值的定义。

2. 分类参数的行为变化(get_defined_constants(true)

从 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,也会新增到输出结果中。

3. 编译和运行环境的差异

某些常量是否出现在 get_defined_constants() 的结果中,可能受到配置文件(如 php.ini)或编译选项的影响。例如是否启用了 Zend OPcache,是否加载了特定扩展模块等。

示例代码(在 CLI 中运行):

define('MY_APP_VERSION', '1.0.0');
print_r(get_defined_constants());

这个输出在开发服务器与生产服务器之间常常不一致,因为它们启用的扩展和配置参数可能不同。

4. 新引入的语言结构和内建常量

PHP 8 引入了 JIT、match 表达式、属性(attributes)等语法特性,也相应带来了新常量。运行 get_defined_constants() 会发现如 PHP_FD_SETSIZET_MATCHT_ATTRIBUTE 等常量的出现。

这些新常量在旧版本中完全不存在,因此如果你在写兼容性强的代码时依赖这些常量,一定要使用 defined() 函数加以判断。

5. 常量值的改变或删除

极少数情况下,某些已定义常量在新版本中会被更改或废弃。虽然 PHP 团队通常会确保向后兼容,但也不排除在重大版本升级时进行调整。例如一些与底层系统交互的扩展,因依赖 C 库的更新,可能会改变默认值或删除某些不再支持的常量。