我的代码就像
$perm = "0777"; //this is fetched from the database
chmod("myFolder/", $perm);
但是 $perm 的值不是八进制,如何将变量的数据类型更改为八进制?即使有替代方法也可以
正如前面提到的,没有八进制数类型。 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)
似乎没有什么对我有用,所以我只是创建了一个非常愚蠢的解决方案,我只是将其发布在这里。
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));
我需要将
chmod()
的模式组件作为函数内的变量提供。我花了足够的时间尝试(但失败了)将字符串转换为八进制,同时保持 0777 值。最后,我决定放弃chmod()
/ftp_chmod()
并选择ftp_site()
,它不会因字符串类型模式代码而卡住。
if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){
// handle the error
}
这对我有用。如果这存在某种缺陷或不是最佳实践,请解释。
编辑:一些读者可能会拒绝这个 ftp_ 解决方案作为作弊,因为它不是文件系统功能解决方案。这对我来说不是问题,因为我正在 ftp 类中编写一个函数。
八进制不是一种类型。整数是类型。
您想要将字符串转换为 int,并且由于字符串以零开头,因此它将是八进制整数。
为此使用 intval:
chmod('myFolder/', intval($perm));