【问题标题】:Change '0777' string to 0777 octal LITERALLY将 '0777' 字符串更改为 0777 八进制 LITERALLY
【发布时间】:2015-04-24 16:14:57
【问题描述】:

我的代码是这样的

$perm = "0777"; //this is fetch from the database
chmod("myFolder/", $perm);

但是 $perm 的值不是八进制的,如何将变量的数据类型更改为八进制?即使是另一种方法也可以

【问题讨论】:

    标签: php permissions chmod octal


    【解决方案1】:

    八进制不是一种类型。整数是类型。

    你想把一个字符串转换成一个整数,因为这个字符串以零开头,所以它将是一个八进制整数。

    为此使用intval

    chmod('myFolder/', intval($perm));
    

    【讨论】:

    • 这行不通,因为这个字符串会被转换为int(777) 并且前导零会消失!
    • 看文档,我特地加了链接...“如果字符串以“0”开头,则基数取8(八进制);”
    • 我只是给你脚本:echo $perm = intval("0777"); chmod("test/", $perm); echo "<br />" . substr(sprintf('%o', fileperms('test/')), -4);创建一个测试文件夹并测试它!看看它是否输出 0777 作为权限!
    • 是的,该脚本输出 777
      0777。
    • 我只是尝试过,但没有将权限更改为 0777
    【解决方案2】:

    如前所述,没有八进制数类型。并且 chmod 函数接收第二个参数作为整数。 $perm 的隐式转换不假定数字是八进制。因此,您需要使用适当的函数将“八进制字符串”转换为整数。

    只需使用octdec 函数

    $perm = "0777"; //this is fetch from the database
    chmod("myFolder/", octdec($perm));
    

    intval

    chmod("myFolder/", intval($perm, 8));
    

    附言

    var_dump('0644' == 0644);             // bool(false)
    var_dump(intval('0644') == 0644);     // bool(false)
    var_dump(decoct('0644') == 0644);     // bool(false)
    
    var_dump(octdec('0644') == 0644);     // bool(true)
    var_dump(intval('0644', 8) == 0644);  // bool(true)
    

    【讨论】:

    • 要明确一点,PHP中有八进制整数格式,per the manual "整数可以指定十进制(以10为底)、十六进制(以16为底)、八进制(以8为底)或二进制(以 2 为基数)表示法" -- 由前导零表示。另外请看manual on chmodchmod("/somedir/somefile", 0755); // octal; correct value of mode。在当今类型严格的环境中,您的第一个 chmod 示例会引发类型错误,因为 octdec 返回的是字符串,而不是整数。
    • @MarkusAO,肯定有许多不同的符号可以在代码中写入数字。但是没有八进制数类型,只有整数。 octdec 也返回 int....
    • 抱歉,我想在 decoct() 返回一个字符串时做个说明。在相关注释中,PHP 似乎不记得整数是用什么基本表示法定义的,例如,整数变量默认情况下总是返回十进制整数。
    【解决方案3】:

    似乎没有什么对我有用,所以我只是创建了一个非常愚蠢的解决方案,我将把它发布在这里。

    function permtooct($permissions) {      
    
        $mode = 0; 
        if ($permissions[0] == '1') $mode += 01000; 
        if ($permissions[0] == '2') $mode += 02000; 
        if ($permissions[0] == '3') $mode += 03000; 
        if ($permissions[0] == '4') $mode += 04000; 
        if ($permissions[0] == '5') $mode += 05000; 
        if ($permissions[0] == '6') $mode += 06000; 
        if ($permissions[0] == '7') $mode += 07000; 
    
        if ($permissions[1] == '1') $mode += 0100; 
        if ($permissions[1] == '2') $mode += 0200; 
        if ($permissions[1] == '3') $mode += 0300; 
        if ($permissions[1] == '4') $mode += 0400; 
        if ($permissions[1] == '5') $mode += 0500; 
        if ($permissions[1] == '6') $mode += 0600; 
        if ($permissions[1] == '7') $mode += 0700; 
    
        if ($permissions[2] == '1') $mode += 010; 
        if ($permissions[2] == '2') $mode += 020; 
        if ($permissions[2] == '3') $mode += 030; 
        if ($permissions[2] == '4') $mode += 040; 
        if ($permissions[2] == '5') $mode += 050; 
        if ($permissions[2] == '6') $mode += 060; 
        if ($permissions[2] == '7') $mode += 070; 
    
        if ($permissions[3] == '1') $mode += 01; 
        if ($permissions[3] == '2') $mode += 02; 
        if ($permissions[3] == '3') $mode += 03; 
        if ($permissions[3] == '4') $mode += 04; 
        if ($permissions[3] == '5') $mode += 05; 
        if ($permissions[3] == '6') $mode += 06; 
        if ($permissions[3] == '7') $mode += 07; 
    
        return($mode);
    }
    $a = "0777";
    chmod("myFolder/", permtooct($a));
    

    【讨论】:

      【解决方案4】:

      我需要将chmod() 的模式组件作为函数内的变量提供。我花了足够的时间尝试(但失败)将字符串转换为八进制,同时保持 0777 值。最后,我决定放弃chmod()/ftp_chmod(),选择了ftp_site(),它不会卡在字符串类型的模式代码上。

      if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){
          // handle the error
      }
      

      这对我有用。如果这在某种程度上存在缺陷或不是最佳实践,请解释。

      编辑:有些读者可能会拒绝这个 ftp_ 解决方案作为作弊,因为它不是文件系统功能解决方案。这对我来说不是问题,因为我在 ftp 类中编写函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-22
        • 2020-01-14
        • 2012-05-31
        • 2012-05-17
        • 1970-01-01
        • 2011-09-20
        • 2021-09-07
        相关资源
        最近更新 更多