php八进制怎么定义 php如何表示八进制整型【扫盲】

3次阅读

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

php八进制怎么定义 php如何表示八进制整型【扫盲】

PHP 八进制整型怎么写?直接看前缀

PHP 里定义八进制整数,最核心就一个规则:**数字字面量开头必须是 00o0O**。三种写法都合法,但行为和兼容性不同:

  • 0123:传统写法,PHP 所有版本都支持;但注意——从 PHP 7 起已标记为“过时(deprecated)”,PHP 9 很可能彻底移除
  • 0o1230O123:PHP 8.1.0 新增的现代写法,语义清晰、不易和十进制混淆,推荐新项目使用
  • 八进制只允许数字 0–7;一旦出现 89,比如 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) 转整数

八进制字面量本质是书写语法糖,不是独立类型;它的“八进制感”只存在于代码编写那一刻,之后就彻底消失在整数世界里了。

text=ZqhQzanResources