PHP 8.1 的显式八进制是字面量语法(如 0o755),非函数;0o 开头即被解析为八进制整数,取代已弃用的前导零写法(如 0755),提升语义清晰性与静态分析支持。

PHP 8.1 没有叫 ExplicitOctal 的函数,也没有任何内置函数需要你“调用”来启用显式八进制——它是一种**字面量语法特性**,直接写就能用,不需要函数介入。
显式八进制是语法,不是函数调用
你写的 0o123 或 0O777 在 PHP 8.1+ 中会被解析器原生识别为八进制整数,和 0x1A(十六进制)、0b1010(二进制)一样,属于语言层面的数字字面量。不存在 ExplicitOctal()、parse_octal_explicit() 这类函数。
常见误解来源:有人看到 PHP-Parser 的 ExplicitOctalEmulator 类,误以为这是供开发者调用的工具。其实它是解析器内部用于兼容旧版 PHP 的仿真逻辑,普通业务代码完全接触不到。
怎么安全地写显式八进制字面量
-
0o或0O开头,后面只跟0–7的数字,例如:0o0、0o755、0O1_2_3(支持下划线分隔符) - 不能混入非法字符:
0o8、0o99、0o12g都会报Parse error: Invalid numeric literal - 与传统前导零八进制(如
0755)共存,但后者在 PHP 8.1+ 已被标记为“deprecated”,未来版本可能彻底移除 - 值本身仍是整型,
var_dump(0o755)输出int(493),和octdec('755')结果一致
为什么不用 octdec() 而要写 0o755
两者用途完全不同:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
octdec('755')是运行时函数调用,把字符串转成整数,适合从配置、用户输入等动态来源解析八进制 -
0o755是编译期字面量,写死在代码里,无性能开销,语义清晰,且能被静态分析工具、IDE 和 AST 解析器准确识别 - 如果你硬要用
octdec()表示固定权限值,不仅多一次函数调用,还失去类型提示和 IDE 补全支持 - 注意:
octdec()输入必须是纯八进制字符串(不含0o前缀),传'0o755'会返回0,因为开头非数字
容易踩的坑:前导零 + 数字混合场景
这是最常引发 Invalid numeric literal 的地方:
- 写
$mode = 0755;→ PHP 8.1+ 仍允许,但已触发Deprecated: Octal notation with leading zero is deprecated警告 - 写
$mode = 089;→ 直接报错,因为089既不是合法八进制(含8),又不被当作十进制(前导零禁止) - 正确做法:明确意图——如果是权限或硬件寄存器这类天然八进制含义的值,统一改用
0o755;如果是普通编号如“房间号 089”,就该用字符串'089'或十进制89 - JSON 或数据库读出的带前导零数字(如
"0755"),必须用octdec()解析,不能直接加0o前缀拼接
显式八进制的价值不在“怎么调用”,而在“怎么写得清、跑得稳、改得明”——它把意图刻进语法里,而不是靠函数名或注释去猜。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










