PHP 5.6+ 中常量值必须编译期确定,仅允许字面量、已定义常量及静态运算(如数字计算、字符串拼接、布尔组合),禁止函数调用、变量、动态超全局等;运行时值需用 define(),命名空间常量推荐 const 定义并支持 use const 导入。

PHP 5.6+ 中,**常量本身不能直接调用内置函数**(如 time()、strlen() 等)来定义,因为常量值必须在**编译期可确定**——即不能依赖运行时计算。所谓“标量表达式”,指的是由字面量、已定义常量、运算符组成的**纯静态表达式**,不包含函数调用、变量、方法调用等动态成分。
哪些标量表达式是允许的
PHP 5.6+ 支持 const 定义中使用简单标量表达式,前提是所有参与项都是编译期已知的:
- 数字运算:
const MAX_SIZE = 1024 * 1024; - 字符串拼接:
const APP_NAME = 'MyApp' . ' v2'; - 布尔/算术组合:
const IS_DEBUG = true && (1 === 1); - 已有常量参与:
const DB_PORT = 3306; const FULL_PORT = DB_PORT + 10;
哪些情况明确不被允许
以下写法在 PHP 5.6+ 中会报 Parse error: syntax error 或 Compile Error:
- 调用任何函数:
const NOW = time();❌ - 使用变量:
$env = 'prod'; const ENV = $env;❌ - 调用类方法或魔术方法:
const VERSION = MyHelper::getVer();❌ - 使用
$_SERVER、__DIR__等超全局或魔术常量以外的动态值(注意:__FILE__、__DIR__是允许的,它们属于编译期确定的魔术常量)
需要运行时值怎么办?用 define() 配合判断
如果确实要基于函数返回值定义常量(例如根据环境设不同配置),只能用 define(),且必须放在运行时逻辑中:
立即学习“PHP免费学习笔记(深入)”;
- 在条件分支里定义:
if (getenv('APP_ENV') === 'dev') { define('DEBUG', true); } - 结合函数结果:
define('CACHE_TTL', (int) getenv('CACHE_TTL') ?: 3600); - 注意:这类定义无法被 IDE 静态分析,也不支持
use const导入
命名空间中定义常量的正确姿势
PHP 5.6+ 支持在命名空间内用 const 定义常量,语法清晰、性能更好:
namespace MyApp\Config; const VERSION = '5.6.1'; const API_TIMEOUT = 5 * 1000;- 外部使用时可用完全限定名:
\MyApp\Config\VERSION - 也可导入后简洁使用:
use const MyApp\Config\VERSION; echo VERSION;



















