php八进制整型以0、0o或0o开头:0123(已弃用)、0o123(php8.1+推荐);值按八进制解析为十进制存储,如0123=83;运行时无法区分字面量来源;权限等需保留八进制格式的场景应存字符串。

PHP 八进制整型怎么写?直接看前缀
PHP 里定义八进制整数,最核心就一个规则:**数字字面量开头必须是 0、0o 或 0O**。三种写法都合法,但行为和兼容性不同:
-
0123:传统写法,PHP 所有版本都支持;但注意——从 PHP 7 起已标记为“过时(deprecated)”,PHP 9 很可能彻底移除 -
0o123或0O123:PHP 8.1.0 新增的现代写法,语义清晰、不易和十进制混淆,推荐新项目使用 - 八进制只允许数字
0–7;一旦出现8或9,比如0128,PHP 会直接报错Parse error: Invalid numeric literal
为什么 0123 算的是 83,不是 123?
因为它是八进制,不是十进制。PHP 解析时会按「以 8 为底」换算:0123 = 1×8² + 2×8¹ + 3×8⁰ = 64 + 16 + 3 = 83。这个转换在代码运行前就完成了,变量存的已经是十进制整数值。
- 用
var_dump($n)查看,输出永远是int(83),不会显示成八进制 - 想确认一个整数是否由八进制字面量定义?只能回看源码——PHP 运行时无法区分
$a = 0123和$b = 83,它们在内存中完全等价 - 别指望用
printf("%o", $n)反推原始写法,它只是把当前整数值转成八进制字符串输出
八进制相关函数:decoct() 不是反向构造,而是格式化输出
decoct() 的作用很明确:把一个十进制整数转成八进制字符串表示,比如 decoct(83) 返回 "123"。但它不能还原你当初写的 0123 字面量,也不影响变量类型或值。
- 参数必须是整数,传浮点数如
decoct(83.5)会先截断为83 - 返回值是字符串,不是整数;如果需要再参与计算,得手动
(int)decoct(83)——但这毫无意义,因为结果是123(十进制),不是原来的八进制含义 - 真正需要“八进制字符串”的场景,通常是日志、权限掩码展示(如
0644),这时直接拼接更安全:"0" . decoct(420)
最容易被忽略的坑:八进制前缀和字符串拼接/JSON 的隐式冲突
你以为 $mode = 0644 就是设个文件权限?没问题。但一旦混入字符串或 JSON 输出,问题就来了:
立即学习“PHP免费学习笔记(深入)”;
- 拼接时:
"chmod " . 0644→ 实际得到"chmod 420"(因为0644八进制 = 十进制 420) - JSON 编码:
json_encode(["mode" => 0644])→ 输出{"mode":420},而非你期待的"0644" - 解决办法:权限这类“语义上是八进制”的值,建议统一用字符串存储:
$mode = "0644",需要计算时再用octdec($mode)转整数
八进制字面量本质是书写语法糖,不是独立类型;它的“八进制感”只存在于代码编写那一刻,之后就彻底消失在整数世界里了。











