有没有办法在 PHP 中的 mkdir() 或 chmod() 中设置字符串权限模式?

Is there a way to set a string permission mode in mkdir() or chmod() in PHP?

当我查找 mkdir() 和 chmod() 的 PHP 手册时,似乎这两个函数都需要一个整数值(例如 mkdir( 'a/dir/path', 0700, false ); ).我确实看到我可以在模式参数上使用其他模式,例如 inval() 或 ocdec(),所以我想知道...是否有类似的字符串?

例如,mkdir( 'a/dir/path', strval( 'u+rwx' ), false );。这样做的原因是,当其他(也)没有 PHP 经验的人阅读我的代码时,我设置的权限会更加明显。

据我所知,没有内置的方法可以做到这一点。我也不认为有必要。 link 对文件权限的解释和来自 http://www.onlamp.com/pub/a/php/2003/02/06/php_foundations.html 的评论就足够了:

Value   Permission Level
--------------------------
400     Owner Read
200     Owner Write
100     Owner Execute
 40     Group Read
 20     Group Write
 10     Group Execute
  4     Global Read
  2     Global Write
  1     Global Execute

Permission Calculations:
------------------------
   400  Owner Read
+  100  Owner Execute
+   20  Group Write
+    4  Global Read
-----------------------------
= 0524  Total Permission Value

这比编写函数正确解析所有可能用作文件权限的字符串更容易。

首先,我认为没有必要实现那种功能:数字权限对于懂得阅读的人来说实际上是直观的。

但是,要回答这个问题,要转换像“-rwxr-xrw-”这样的字符串,您可以使用类似这样的函数:

N.B.: 你真的应该在下面的函数中添加一些输入验证(检查字符串长度、有效字符等)

function format($permissions)
{
    //Initialize the string that will contain the parsed perms.
    $parsedPermissions = "";

    //Each char represents a numeric constant that is being added to the total
    $permissionsDef = array(
        "r" => 4,
        "w" => 2,
        "x" => 1,
        "-" => 0
    );

    //We cut the first of the 10 letters string
    $permissions = substr($permissions, 1);

    //We iterate each char
    $permissions = str_split($permissions);
    $length = count($permissions);

    $group = 0;

    for ($i = 0, $j = 0; $i < $length; $i++, $j++) {
        if ($j > 2) {
            $parsedPermissions .= $group;

            $j = 0;
            $group = 0;
        }
        $group += $permissionsDef[$permissions[$i]];
    }

    $parsedPermissions .= $group;

    return $parsedPermissions;
}