php中定义整型常量可用define()(运行时、支持动态名)或const(编译期、更快、类中必需);预定义整型常量如e_error、json_throw_on_error等需用名称而非硬编码数字;php_int_max是平台相关int上限,超限字面量转float导致精度丢失。

PHP里怎么定义自己的整型常量
用 define() 或 const 关键字都可以,但行为有区别。define() 是函数,运行时执行,支持变量名拼接;const 是语言结构,编译期解析,更快更严格。
-
define('MAX_RETRY', 3);—— 支持动态名,比如define($name, 5) -
const MIN_LEVEL = 1;—— 必须写死名字,不能用变量,但可放在类里(class const) - PHP 7.4+ 支持
const定义数组,但整型常量不涉及这点,不用管 - 别在循环里反复调用
define(),会报 Warning:Constants may not be defined more than once
PHP自带的整型常量有哪些真有用
不是所有预定义常量都是整数,得筛。真正常用、值为整型的集中在错误控制、JSON、PCRE、ZLIB 这几类。
- 错误报告类:
E_ERROR(1)、E_WARNING(2)、E_PARSE(4)、E_NOTICE(8)……它们是位掩码,可以按位或组合,比如E_ERROR | E_WARNING - JSON 解析选项:
JSON_THROW_ON_ERROR(1 - PCRE 匹配标志:
PREG_OFFSET_CAPTURE(256)、PREG_UNMATCHED_AS_NULL(262144)——这些值本身不重要,但传错会导致preg_match()行为异常 - ZLIB 压缩级别:
ZLIB_NO_COMPRESSION(0)、ZLIB_BEST_SPEED(1)、ZLIB_BEST_COMPRESSION(9)
别硬记数字,直接用常量名。有人写 if ($level === 1) 判断是否是 ZLIB_BEST_SPEED,这在升级 PHP 或换扩展时可能崩。
define() 和 const 定义整型常量时的兼容性坑
PHP 5.6 开始支持命名空间下的 const,但类外的 const FOO = 1; 在 5.5 及更早版本会 Parse error。
立即学习“PHP免费学习笔记(深入)”;
- PHP define('FOO', 1)
- PHP ≥ 5.6:顶层
const FOO = 1;合法,且比define()快约 15%(微不足道,但写法更干净) - 类中定义必须用
const,define()不生效 - 常量名区分大小写,
define('foo', 1)和define('FOO', 1)是两个常量,但后者才是惯例
有个隐蔽问题:如果用 define('DEBUG', true),它其实是布尔常量,不是整型。想强制整型就写 define('DEBUG', (int)true) 或直接 define('DEBUG', 1)。
为什么 var_dump(PHP_INT_MAX) 不等于你预期的“最大整数”
PHP_INT_MAX 是当前平台能表示的最大有符号整数,32 位系统是 2147483647,64 位是 9223372036854775807。但它不是“PHP 能处理的最大数”,只是 int 类型的上限。
- 超过
PHP_INT_MAX的字面量(如9223372036854775808)会被自动转成float,精度丢失 -
var_dump(9223372036854775808);输出float(9.2233720368548E+18),不是 int - 想安全处理大整数,得用
gmp或bcmath扩展,或者字符串存
这点容易被忽略:你定义了个常量 define('BIG_ID', 9223372036854775808);,它其实已经是 float,后续参与运算可能出乎意料。











