类中定义整型常量必须用const而非define(),且需编译期确定的整数字面量;php 7.1+支持public/private/protected const,旧版仅支持隐式public const;超大整数需注意平台限制,动态计算应改用静态方法或match。

类中定义整型常量用 const,不是 define()
PHP 类里不能用全局函数 define() 定义常量——它只作用于全局命名空间,类内部调用会报 Warning: define() cannot be used in a class method。必须用 const 关键字,且必须在声明时直接赋值整型字面量(如 42、0xFF),不能是表达式或函数调用。
常见错误:写成 const STATUS_ACTIVE = intval('1'); 或 const MAX_RETRY = pow(2, 3); —— PHP 会在编译期报错 Constant expression contains invalid operations。
-
const声明必须是编译期可确定的值:支持整数字面量、负号、进制前缀(0b、0x、0)、位运算符(|、&、^)等简单组合 - 不支持变量、函数调用、数组索引、类常量引用(除非是同一类中已定义的、且顺序在前的常量)
- 从 PHP 8.1 起支持枚举(
enum),但那是另一套机制,不替代const
public const 是 PHP 7.1+ 才支持的语法
老项目如果还在用 PHP 7.0 或更早版本,public const STATUS_OK = 200; 会直接解析失败,报 Parse error: syntax error, unexpected 'const'(因为旧版只允许 const STATUS_OK = 200;,隐式 public)。
所以得看环境:PHP 7.1+ 推荐显式加访问修饰符,明确意图;PHP 7.0 及以下只能省略,且所有类常量默认就是 public,无法设为 private/protected。
立即学习“PHP免费学习笔记(深入)”;
Avactis是一个强大的PHP在线购物系统拥有多个版本包括开源版本。它具备一个在线购物系统所需要的所有功能从产品到会员管理,订单和营销。可以无限分类和为产品指定任务数量的图片(支持自动生成缩略图)。使用自定义字段功能,让你可以更好地定义一个产品。该系统提供以非常灵活的方式来创建任意类型的促销活动如设置折扣代码,基于价格的折扣或基于数量的折扣等。
- PHP 7.1+ 支持
public const、private const、protected const - PHP 7.0 及以下只接受
const NAME = VALUE;,等价于public const - 即使 PHP 7.1+,
private const也无法被子类继承,这点和private static一致
整型常量值过大时注意平台整数范围
PHP 的整型范围取决于系统架构:32 位系统最大是 2147483647(PHP_INT_MAX),64 位通常是 9223372036854775807。如果你写 const BIG_NUM = 99999999999999999999;,在 32 位环境里会被静默转成 float,再用 is_int() 判断会返回 false。
这不是语法错误,而是运行时类型漂移,容易在条件判断或 switch 中出问题。
- 用
var_dump()检查常量实际类型,别只信名字叫 “INT” - 跨平台项目建议避免超过
PHP_INT_MAX的字面量,或改用字符串 + bcmath 处理 - 十六进制写法(如
0xFFFFFFFF)同样受平台限制,不是“绝对大”
类常量不能动态赋值,但可以用 match 或静态方法模拟逻辑
有人想根据配置动态算出常量值,比如 const RETRY_DELAY = $config['retry'] * 1000; —— 这在语法上完全不合法,const 不接受任何变量上下文。
真有这种需求,得退一步:用 private static 属性 + 静态方法封装,或者用 match(PHP 8.0+)做映射。虽然不叫“常量”,但效果可控。
- 错误示范:
const TIMEOUT = self::$defaultTimeout * 1000;→ 解析失败 - 可行替代:
public static function getTimeout(): int { return (int)($_ENV['TIMEOUT_MS'] ?? 5000); } - 若需 switch-like 行为,优先用
match而非if-else,它更接近常量语义
整型常量的“整”字只是说值是整数,不代表定义方式能绕过 PHP 的编译期约束。最常翻车的地方,其实是把“想让它不变”和“语言允许它不变”混为一谈——前者是业务意图,后者得靠语法和版本兜底。









