PHP mkdir()权限参数必须用八进制字面量(如0755),因系统底层权限模型基于八进制,0755被解析为十进制493→二进制111101101(rwxr-xr-x),而755作为十进制数会映射错误权限位导致混乱。

PHP 的 mkdir() 函数要求权限参数用**八进制字面量**(即以 0 开头,如 0755、0777),根本原因在于:PHP 需要明确区分“数字字面量”和“字符串”,而 Unix/Linux 系统的权限模型天然基于八进制。
权限在系统底层就是八进制的
Linux/Unix 中,文件权限用三位八进制数表示(如 755),每位分别对应所有者(user)、所属组(group)、其他人(others),每组三位二进制(rwx)刚好映射为 0–7 的一个八进制数字。PHP 的 mkdir() 直接调用系统 mkdir(2) 系统调用,后者接收的就是这个原始的八进制数值。写成 755(十进制七百五十五)会被系统误读为完全不同的位模式,导致权限混乱。
不加前导 0 就不是八进制,而是十进制
PHP 解析器看到 755 默认当十进制整数;只有以 0 开头(如 0755),它才按 C 语言传统识别为八进制字面量。例如:
-
0755→ 八进制 → 十进制 493 → 二进制111101101→ 对应 rwxr-xr-x -
755→ 十进制 → 二进制1011110011→ 系统无法按权限位解析,结果不可控
加引号会彻底失效
写成 '0755' 或 "0777" 是常见错误。此时 PHP 把它当字符串传入,mkdir() 会尝试类型转换——但某些版本可能警告“undefined constant”,或静默转为十进制 755/777,最终权限错乱。官方文档和内核源码均要求该参数为 整数类型,且语义必须是八进制值。
立即学习“PHP免费学习笔记(深入)”;
为什么不能只用十进制换算?
理论上你可以手动把八进制转成十进制(如 0777 = 511),再传 511。但这违背可读性与惯例:
— 其他人一眼看不出这是权限;
— 容易算错(比如 0777 ≠ 777);
— 所有 PHP 文档、教程、框架配置(如 CodeIgniter 的 FCPATH . 'writable')都统一使用带前导 0 的写法,保持一致才不易出错。



















